Skip to main content

No project description provided

Project description

pytest-kubernetes

pytest-kubernetes is a lightweight pytest plugin that makes managing (local) Kubernetes clusters a breeze. You can easily spin up a Kubernetes cluster with one pytest fixure and remove them again. The fixture comes with some simple functions to interact with the cluster, for example kubectl(...) that allows you to run typical kubectl commands against this cluster without worring about the kubeconfig on the test machine.

Features:

  • Set up and tear down (local) Kubernetes clusters with minikube, k3d and kind
  • Configure the cluster to recreate for each test case (default), or keep it across multiple test cases
  • Automatic management of the kubeconfig
  • Simple functions to run kubectl commands (with dict output), reading logs and load custom container images
  • Wait for certain conditions in the cluster
  • Port forward Kubernetes-based services (using kubectl port-forward) easily during a test case
  • Management utils for custom pytest-fixtures (for example pre-provisioned clusters)

Installation

This plugin can be installed from PyPI:

  • pip install pytest-kubernetes
  • poetry add -D pytest-kubernetes

Note that this package provides entrypoint hooks to be automatically loaded with pytest.

Requirements

pytest-kubernetes expects the following components to be available on the test machine:

  • kubectl
  • minikube (optional for minikube-based clusters)
  • k3d (optional for k3d-based clusters)
  • kind (optional for kind-based clusters)
  • Docker (optional for Docker-based Kubernetes clusters)

Please make sure they are installed to run pytest-kubernetes properly.

Reference

Fixture

k8s

The k8s fixture provides access to an automatically selected Kubernetes provider (depending on the availability on the host). The priority is: k3d, kind, minikube-docker and minikube-kvm2.

The fixture passes a manager object of type AClusterManager.

It provides the following interface:

  • kubectl(...): Execute kubectl command against this cluster (defaults to dict as returning format)
  • apply(...): Apply resources to this cluster, either from YAML file, or Python dict
  • load_image(...): Load a container image into this cluster
  • wait(...): Wait for a target and a condition
  • port_forwarding(...): Port forward a target
  • logs(...): Get the logs of a pod
  • version(): Get the Kubernetes version of this cluster
  • create(...): Create this cluster (pass special cluster arguments with options: List[str] to the CLI command)
  • delete(): Delete this cluster
  • reset(): Delete this cluster (if it exists) and create it again

The interface provides proper typing and should be easy to work with.

Example

def test_a_feature_with_k3d(k8s: AClusterManager):
    k8s.create()
    k8s.apply(
        {
            "apiVersion": "v1",
            "kind": "ConfigMap",
            "data": {"key": "value"},
            "metadata": {"name": "myconfigmap"},
        },
    )
    k8s.apply("./dependencies.yaml")
    k8s.load_image("my-container-image:latest")
    k8s.kubectl(
        [
            "run",
            "test",
            "--image",
            "my-container-image:latest",
            "--restart=Never",
            "--image-pull-policy=Never",
        ]
    )

This cluster will be deleted once the test case is over.

Please note that you need to set "--image-pull-policy=Never" for images that you loaded into the cluster via the k8s.load(name: str) function (see example above).

Marks

pytest-kubernetes uses pytest marks for specifying the cluster configuration for a test case

Currently the following settings are supported:

  • provider (str): request a specific Kubernetes provider for the test case
  • cluster_name (str): request a specific cluster name
  • keep (bool): keep the cluster across multiple test cases

Example

@pytest.mark.k8s(provider="minikube", cluster_name="test1", keep=True)
def test_a_feature_in_minikube(k8s: AClusterManager):
    ...

Utils

To write custom Kubernetes-based fixtures in your project you can make use of the following util functions.

select_provider_manager

This function returns a deriving class of AClusterManager that is not created and wrapped in a fixture yet.

select_provider_manager(name: Optional[str] = None) -> Type[AClusterManager]

The returning object gets called with the init parameters of AClusterManager, the cluster_name: str.

Example

@pytest.fixture(scope="session")
def k8s_with_workload(request):
    cluster = select_provider_manager("k3d")("my-cluster")
    # if minikube should be used
    # cluster = select_provider_manager("minikube")("my-cluster")
    cluster.create()
    # init the cluster with a workload
    cluster.apply("./fixtures/hello.yaml")
    cluster.wait("deployments/hello-nginxdemo", "condition=Available=True")
    yield cluster
    cluster.delete()

In this example, the cluster remains active for the entire session and is only deleted once pytest is done.

Note that yield notation that is prefered by pytest to express clean up tasks for this fixture.

Special cluster options

You can pass more options using kwargs['options']: List[str] to the create(options=...) function when creating the cluster like so:

    cluster = select_provider_manager("k3d")("my-cluster")
    # bind ports of this k3d cluster
    cluster.create(options=["--agents", "1", "-p", "8080:80@agent:0", "-p", "31820:31820/UDP@agent:0"])

Examples

Please find more examples in tests/vendor.py in this repository. These test cases are written as users of pytest-kubernetes would write test cases in their projects.

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_kubernetes-0.6.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

pytest_kubernetes-0.6.0-py3-none-any.whl (16.4 kB view details)

Uploaded Python 3

File details

Details for the file pytest_kubernetes-0.6.0.tar.gz.

File metadata

  • Download URL: pytest_kubernetes-0.6.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for pytest_kubernetes-0.6.0.tar.gz
Algorithm Hash digest
SHA256 9355190ce0a5a0cf0dce2ddffc8119afab555a824ce85e6012a213992f0f24cd
MD5 c9c7597db072d24ffd81b4d1a5b9de49
BLAKE2b-256 1213858eb59c87cd257eabe11ca2182992119024280239df332df33e50f22cb9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytest_kubernetes-0.6.0.tar.gz:

Publisher: cd.yaml on Blueshoe/pytest-kubernetes

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pytest_kubernetes-0.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_kubernetes-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ecf20ad4296af529d3757aafb7337a208350c5ce240d9a73f095ec72035620ff
MD5 fe5a0781cdde69d4ebd09bb79a2c11ef
BLAKE2b-256 eb882303436f23507d7efdcb1145bb9434f80019eef6ac26394b48483d7ec07c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytest_kubernetes-0.6.0-py3-none-any.whl:

Publisher: cd.yaml on Blueshoe/pytest-kubernetes

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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