testcontainers / testcontainers/testcontainers-python

Question: Test postgres container

Đang mở
#796 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

📖 documentation
Ngôn ngữ chính
Python
Star
2.3k
Fork
386
Merge trung bình
4 giờ 40 phút
Pull request đã merge (30 ngày)
1

Mô tả

What are you trying to do?

Run a minimal example with testcontainers. Run command:

pip install pytest
python3 test_postgres_container.py

test_postgres_container.py

import requests
import yaml
import time
import os

from testcontainers.k3s import K3SContainer
from testcontainers.postgres import PostgresContainer
from kubernetes import client, config

def wait_for_pod_ready(config_dict, namespace="default", timeout=120):
    """
    Wait for all pods in the namespace to be ready.
    """
    from kubernetes import client, config

    config.load_kube_config(config_file=config_dict)
    v1 = client.CoreV1Api()

    end_time = time.time() + timeout
    while time.time() < end_time:
        pods = v1.list_namespaced_pod(namespace=namespace)
        if all(p.status.phase == "Running" for p in pods.items):
            return True
        time.sleep(5)
    raise TimeoutError("Timeout waiting for pods to be ready")


def test_kubernetes_app():
    # Spin up PostgreSQL Container
    with PostgresContainer("postgres:15.0") as postgres:
        postgres_host = postgres.get_container_host_ip()
        postgres_port = postgres.get_exposed_port(5432)

        # Set up Kubernetes cluster
        with K3SContainer() as k3s:
            config_dict=yaml.safe_load(k3s.config_yaml())
            
            config.load_kube_config_from_dict(config_dict)

            os.environ["KUBECONFIG"] = config_dict

            # Apply Kubernetes manifests
            os.system(f"kubectl apply -f kubernetes/app.yaml")
            os.system(f"kubectl apply -f kubernetes/postgres.yaml")

            # Wait for all pods to be ready
            wait_for_pod_ready(config_dict)

            # Send an HTTP request to the application
            response = requests.get("http://localhost:8080/health")
            assert response.status_code == 200
            assert "healthy" in response.text

kubernetes/postgres.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:15.0
        env:
        - name: POSTGRES_USER
          value: "user"
        - name: POSTGRES_PASSWORD
          value: "password"
        - name: POSTGRES_DB
          value: "mydb"

---
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  ports:
  - port: 5432
  selector:
    app: postgres

app.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app-image:latest
        ports:
        - containerPort: 8080
        env:
        - name: DATABASE_URL
          value: "postgresql://user:password@postgres:5432/mydb"

---
apiVersion: v1
kind: Service
metadata:
  name: my-app
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

Runtime environment

>> uname -a

Linux DESKTOP-UP6B64S 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

>> docker info
Client: Docker Engine - Community
 Version:    27.5.1
 Context:    default
 Debug Mode: false
 Plugins:
Server:
 Containers: 8
  Running: 7
  Paused: 0
  Stopped: 1
 Images: 34
 Server Version: 27.5.1
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: active
  NodeID: q8b9mpmb1zgtsz81plpx97g6q
  Is Manager: true
  ClusterID: ayrevwl1es784e2k38ogh2j8g
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  Node Address: 172.17.138.216
  Manager Addresses:
   172.17.138.216:2377
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
 runc version: v1.2.4-0-g6c52b3f
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 5.15.153.1-microsoft-standard-WSL2
 Operating System: Ubuntu 22.04.5 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 12
 Total Memory: 7.607GiB
 Name: DESKTOP-UP6B64S
 ID: fe231f46-b911-4db9-b4e0-7a80f27d8058
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Username: brunolnetto1234
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Tái hiện ví dụ bằng python3 test_postgres_container.py và kiểm tra hành vi của test_postgres_container.py, kubernetes/postgres.yamlapp.yaml. Issue không nêu lỗi hoặc thay đổi mong đợi, vì vậy trước tiên hãy xác định bước bị lỗi và xác định xem nguyên nhân là do container PostgreSQL, các Kubernetes manifest hay yêu cầu kiểm tra tình trạng.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
docker, kubernetes, postgresql, python
Lĩnh vực
databases, devops, testing-qa
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
20/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.