testcontainers / testcontainers/testcontainers-python

Question: Test postgres container

Open
#796 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

📖 documentation
Dominant language
Python
Stars
2.3k
Forks
386
Avg merge
4h 40m
Merged PRs (30d)
1

Description

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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the example with python3 test_postgres_container.py and inspect the behavior of test_postgres_container.py, kubernetes/postgres.yaml, and app.yaml. The issue does not state an error or expected change, so first identify the failing step and determine whether the PostgreSQL container, Kubernetes manifests, or health request is responsible.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, kubernetes, postgresql, python
Domain
databases, devops, testing-qa
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.