Skip to main content

Kubernetes test support with KIND for pytest

Project description

pytest-kind

Build Status PyPI PyPI - Python Version License CalVer

Test your Python Kubernetes app/operator end-to-end with kind and pytest.

pytest-kind is a plugin for pytest which provides the kind_cluster fixture. The fixture will install kind 0.10.0, create a Kubernetes 1.20 cluster, and provide convenience functionality such as port forwarding.

Usage

Install pytest-kind via pip or via poetry, e.g.:

poetry add --dev pytest-kind

Write your pytest functions and use the provided kind_cluster fixture, e.g.:

def test_kubernetes_version(kind_cluster):
    assert kind_cluster.api.version == ('1', '20')

To load your custom Docker image and apply deployment manifests:

import requests
from pykube import Pod

def test_myapp(kind_cluster):
    kind_cluster.load_docker_image("myapp")
    kind_cluster.kubectl("apply", "-f", "deployment.yaml")
    kind_cluster.kubectl("rollout", "status", "deployment/myapp")

    # using Pykube to query pods
    for pod in Pod.objects(kind_cluster.api).filter(selector="app=myapp"):
        assert "Sucessfully started" in pod.logs()

    with kind_cluster.port_forward("service/myapp", 80) as port:
        r = requests.get(f"http://localhost:{port}/hello/world")
        r.raise_for_status()
        assert r.text == "Hello world!"

See the examples directory for sample projects and also check out kube-web-view which uses pytest-kind for its e2e tests.

KindCluster object

The kind_cluster fixture is an instance of the KindCluster class with the following methods:

  • load_docker_image(docker_image): load the specified Docker image into the kind cluster
  • kubectl(*args): run the kubectl binary against the cluster with the specified arguments. Returns the process output as string.
  • port_forward(service_or_pod_name, remote_port, *args): run "kubectl port-forward" for the given service/pod and return the (random) local port. To be used as context manager ("with" statement). Pass the namespace as additional args to kubectl via "-n", "mynamespace".

KindCluster has the following attributes:

  • name: the kind cluster name
  • kubeconfig_path: the path to the Kubeconfig file to access the cluster
  • kind_path: path to the kind binary
  • kubectl_path: path to the kubectl binary
  • api: pykube HTTPClient instance to access the cluster from Python

You can also use KindCluster directly without pytest:

from pytest_kind import KindCluster

cluster = KindCluster("myclustername")
cluster.create()
cluster.kubectl("apply", "-f", "..")
# ...
cluster.delete()

Pytest Options

The kind cluster name can be set via the --cluster-name CLI option.

The kind cluster is deleted after each pytest session, you can keep the cluster by passing --keep-cluster to pytest.

Note that you can use the PYTEST_ADDOPTS environment variable to pass these options to pytest. This also works if you call pytest from a Makefile:

# for test debugging: don't delete the kind cluster
PYTEST_ADDOPTS=--keep-cluster make test

Notes

  • The kind_cluster fixture is session-scoped, i.e. the same cluster will be used across all test modules/functions.
  • The kind and kubectl binaries will be downloaded once to the local directory ./.pytest-kind/{cluster-name}/. You can use them to interact with the cluster (e.g. when --keep-cluster is used).
  • Some cluster pods might not be ready immediately (e.g. kind's CoreDNS take a moment), add wait/poll functionality as required to make your tests predictable.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytest-kind-22.9.0.tar.gz (18.0 kB view details)

Uploaded Source

Built Distribution

pytest_kind-22.9.0-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file pytest-kind-22.9.0.tar.gz.

File metadata

  • Download URL: pytest-kind-22.9.0.tar.gz
  • Upload date:
  • Size: 18.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.8.5 Linux/5.4.0-125-generic

File hashes

Hashes for pytest-kind-22.9.0.tar.gz
Algorithm Hash digest
SHA256 e329763bf90f2f6a8ca65f37044f4e61f8437f77c63e2de1d2da23e4e0e99b1a
MD5 79cb2f503cb97e816f1e81fbd0be41e1
BLAKE2b-256 b746b62cb77840ed8016247b643fc61bdd1272ce371a952767a00ffc11026da5

See more details on using hashes here.

File details

Details for the file pytest_kind-22.9.0-py3-none-any.whl.

File metadata

  • Download URL: pytest_kind-22.9.0-py3-none-any.whl
  • Upload date:
  • Size: 18.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.8.5 Linux/5.4.0-125-generic

File hashes

Hashes for pytest_kind-22.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9a9b693400a60822b10f3419e4f6862b5e85410af4a6780ebf0aea5878e15b26
MD5 6b453f3a5c93ed6f13bf3ce63110ec8d
BLAKE2b-256 856f3e6d0c193d27439891c4f2cd84a2503946f0b9ff8f26aeb4f6eef5d77470

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page