diff options
Diffstat (limited to 'python-pytest-kind.spec')
| -rw-r--r-- | python-pytest-kind.spec | 376 |
1 files changed, 376 insertions, 0 deletions
diff --git a/python-pytest-kind.spec b/python-pytest-kind.spec new file mode 100644 index 0000000..b4a1622 --- /dev/null +++ b/python-pytest-kind.spec @@ -0,0 +1,376 @@ +%global _empty_manifest_terminate_build 0 +Name: python-pytest-kind +Version: 22.11.1 +Release: 1 +Summary: Kubernetes test support with KIND for pytest +License: GPL-3.0+ +URL: https://codeberg.org/hjacobs/pytest-kind +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/28/bc/5816716a372636e90251bbf81a2d51c2eb340dc77cb5e7237c1a455fa3f4/pytest-kind-22.11.1.tar.gz +BuildArch: noarch + +Requires: python3-pykube-ng + +%description +# pytest-kind + +[](https://travis-ci.com/hjacobs/pytest-kind) +[](https://pypi.org/project/pytest-kind/) + + + + +Test your Python Kubernetes app/operator end-to-end with [kind](https://kind.sigs.k8s.io/) and [pytest](https://pytest.org). + +`pytest-kind` is a plugin for pytest which provides the `kind_cluster` fixture. +The fixture will install kind 0.17.0, create a Kubernetes 1.25 cluster, and provide convenience functionality such as port forwarding. + + +## Usage + +Install `pytest-kind` via pip or via [poetry](https://poetry.eustace.io/), e.g.: + +``` +poetry add --dev pytest-kind +``` + +Write your pytest functions and use the provided `kind_cluster` fixture, e.g.: + +```python +def test_kubernetes_version(kind_cluster): + assert kind_cluster.api.version == ('1', '25') +``` + +To load your custom Docker image and apply deployment manifests: + +```python +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](https://codeberg.org/hjacobs/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](https://pykube.readthedocs.io/) HTTPClient instance to access the cluster from Python + +You can also use KindCluster directly without pytest: + +```python +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: + +```bash +# 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. + + +%package -n python3-pytest-kind +Summary: Kubernetes test support with KIND for pytest +Provides: python-pytest-kind +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-pytest-kind +# pytest-kind + +[](https://travis-ci.com/hjacobs/pytest-kind) +[](https://pypi.org/project/pytest-kind/) + + + + +Test your Python Kubernetes app/operator end-to-end with [kind](https://kind.sigs.k8s.io/) and [pytest](https://pytest.org). + +`pytest-kind` is a plugin for pytest which provides the `kind_cluster` fixture. +The fixture will install kind 0.17.0, create a Kubernetes 1.25 cluster, and provide convenience functionality such as port forwarding. + + +## Usage + +Install `pytest-kind` via pip or via [poetry](https://poetry.eustace.io/), e.g.: + +``` +poetry add --dev pytest-kind +``` + +Write your pytest functions and use the provided `kind_cluster` fixture, e.g.: + +```python +def test_kubernetes_version(kind_cluster): + assert kind_cluster.api.version == ('1', '25') +``` + +To load your custom Docker image and apply deployment manifests: + +```python +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](https://codeberg.org/hjacobs/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](https://pykube.readthedocs.io/) HTTPClient instance to access the cluster from Python + +You can also use KindCluster directly without pytest: + +```python +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: + +```bash +# 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. + + +%package help +Summary: Development documents and examples for pytest-kind +Provides: python3-pytest-kind-doc +%description help +# pytest-kind + +[](https://travis-ci.com/hjacobs/pytest-kind) +[](https://pypi.org/project/pytest-kind/) + + + + +Test your Python Kubernetes app/operator end-to-end with [kind](https://kind.sigs.k8s.io/) and [pytest](https://pytest.org). + +`pytest-kind` is a plugin for pytest which provides the `kind_cluster` fixture. +The fixture will install kind 0.17.0, create a Kubernetes 1.25 cluster, and provide convenience functionality such as port forwarding. + + +## Usage + +Install `pytest-kind` via pip or via [poetry](https://poetry.eustace.io/), e.g.: + +``` +poetry add --dev pytest-kind +``` + +Write your pytest functions and use the provided `kind_cluster` fixture, e.g.: + +```python +def test_kubernetes_version(kind_cluster): + assert kind_cluster.api.version == ('1', '25') +``` + +To load your custom Docker image and apply deployment manifests: + +```python +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](https://codeberg.org/hjacobs/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](https://pykube.readthedocs.io/) HTTPClient instance to access the cluster from Python + +You can also use KindCluster directly without pytest: + +```python +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: + +```bash +# 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. + + +%prep +%autosetup -n pytest-kind-22.11.1 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-pytest-kind -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Tue Apr 11 2023 Python_Bot <Python_Bot@openeuler.org> - 22.11.1-1 +- Package Spec generated |
