summaryrefslogtreecommitdiff
path: root/python-kopf.spec
diff options
context:
space:
mode:
Diffstat (limited to 'python-kopf.spec')
-rw-r--r--python-kopf.spec610
1 files changed, 610 insertions, 0 deletions
diff --git a/python-kopf.spec b/python-kopf.spec
new file mode 100644
index 0000000..b8059dd
--- /dev/null
+++ b/python-kopf.spec
@@ -0,0 +1,610 @@
+%global _empty_manifest_terminate_build 0
+Name: python-kopf
+Version: 1.36.0
+Release: 1
+Summary: Kubernetes Operator Pythonic Framework (Kopf)
+License: MIT
+URL: https://github.com/nolar/kopf
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/51/1e/b31f321deca8f40219e03b707e9189e5d1b6258b2119b2e69fb6cde755f3/kopf-1.36.0.tar.gz
+BuildArch: noarch
+
+Requires: python3-typing-extensions
+Requires: python3-json-logger
+Requires: python3-iso8601
+Requires: python3-click
+Requires: python3-aiohttp
+Requires: python3-pyyaml
+Requires: python3-pyngrok
+Requires: python3-oscrypto
+Requires: python3-certbuilder
+Requires: python3-certvalidator
+Requires: python3-pykube-ng
+Requires: python3-kubernetes
+Requires: python3-uvloop
+
+%description
+# Kubernetes Operator Pythonic Framework (Kopf)
+
+[![Supported Python versions](https://img.shields.io/pypi/pyversions/kopf.svg)](https://pypi.org/project/kopf/)
+[![CI](https://github.com/nolar/kopf/workflows/Thorough%20tests/badge.svg)](https://github.com/nolar/kopf/actions/workflows/thorough.yaml)
+[![codecov](https://codecov.io/gh/nolar/kopf/branch/main/graph/badge.svg)](https://codecov.io/gh/nolar/kopf)
+[![Coverage Status](https://coveralls.io/repos/github/nolar/kopf/badge.svg?branch=main)](https://coveralls.io/github/nolar/kopf?branch=main)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/nolar/kopf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/nolar/kopf/alerts/)
+[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/nolar/kopf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/nolar/kopf/context:python)
+[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
+
+**Kopf** —Kubernetes Operator Pythonic Framework— is a framework and a library
+to make Kubernetes operators development easier, just in a few lines of Python code.
+
+The main goal is to bring the Domain-Driven Design to the infrastructure level,
+with Kubernetes being an orchestrator/database of the domain objects (custom resources),
+and the operators containing the domain logic (with no or minimal infrastructure logic).
+
+The project was originally started as `zalando-incubator/kopf` in March 2019,
+and then forked as `nolar/kopf` in August 2020: but it is the same codebase,
+the same packages, the same developer(s).
+
+
+## Documentation
+
+* https://kopf.readthedocs.io/
+
+
+## Features
+
+* Simple, but powerful:
+ * A full-featured operator in just 2 files: a `Dockerfile` + a Python file (*).
+ * Handling functions registered via decorators with a declarative approach.
+ * No infrastructure boilerplate code with K8s API communication.
+ * Both sync and async handlers, with sync ones being threaded under the hood.
+ * Detailed documentation with examples.
+* Intuitive mapping of Python concepts to Kubernetes concepts and back:
+ * Marshalling of resources' data to the handlers' kwargs.
+ * Marshalling of handlers' results to the resources' statuses.
+ * Publishing of logging messages as Kubernetes events linked to the resources.
+* Support anything that exists in K8s:
+ * Custom K8s resources.
+ * Builtin K8s resources (pods, namespaces, etc).
+ * Multiple resource types in one operator.
+ * Both cluster and namespaced operators.
+* All the ways of handling that a developer can wish for:
+ * Low-level handlers for events received from K8s APIs "as is" (an equivalent of _informers_).
+ * High-level handlers for detected causes of changes (creation, updates with diffs, deletion).
+ * Handling of selected fields only instead of the whole objects (if needed).
+ * Dynamically generated or conditional sub-handlers (an advanced feature).
+ * Timers that tick as long as the resource exists, optionally with a delay since the last change.
+ * Daemons that run as long as the resource exists (in threads or asyncio-tasks).
+ * Validating and mutating admission webhook (with dev-mode tunneling).
+ * Live in-memory indexing of resources or their excerpts.
+ * Filtering with stealth mode (no logging): by arbitrary filtering functions,
+ by labels/annotations with values, presence/absence, or dynamic callbacks.
+ * In-memory all-purpose containers to store non-serializable objects for individual resources.
+* Eventual consistency of handling:
+ * Retrying the handlers in case of arbitrary errors until they succeed.
+ * Special exceptions to request a special retry or to never retry again.
+ * Custom limits for the number of attempts or the time.
+ * Implicit persistence of the progress that survives the operator restarts.
+ * Tolerance to restarts and lengthy downtimes: handles the changes afterwards.
+* Awareness of other Kopf-based operators:
+ * Configurable identities for different Kopf-based operators for the same resource kinds.
+ * Avoiding double-processing due to cross-pod awareness of the same operator ("peering").
+ * Pausing of a deployed operator when a dev-mode operator runs outside of the cluster.
+* Extra toolkits and integrations:
+ * Some limited support for object hierarchies with name/labels propagation.
+ * Friendly to any K8s client libraries (and is client agnostic).
+ * Startup/cleanup operator-level handlers.
+ * Liveness probing endpoints and rudimentary metrics exports.
+ * Basic testing toolkit for in-memory per-test operator running.
+ * Embeddable into other Python applications.
+* Highly configurable (to some reasonable extent).
+
+(*) _Small font: two files of the operator itself, plus some amount of
+deployment files like RBAC roles, bindings, service accounts, network policies
+— everything needed to deploy an application in your specific infrastructure._
+
+
+## Examples
+
+See [examples](https://github.com/nolar/kopf/tree/main/examples)
+for the examples of the typical use-cases.
+
+A minimalistic operator can look like this:
+
+```python
+import kopf
+
+@kopf.on.create('kopfexamples')
+def create_fn(spec, name, meta, status, **kwargs):
+ print(f"And here we are! Created {name} with spec: {spec}")
+```
+
+Numerous kwargs are available, such as `body`, `meta`, `spec`, `status`,
+`name`, `namespace`, `retry`, `diff`, `old`, `new`, `logger`, etc:
+see [Arguments](https://kopf.readthedocs.io/en/latest/kwargs/)
+
+To run a never-exiting function for every resource as long as it exists:
+
+```python
+import time
+import kopf
+
+@kopf.daemon('kopfexamples')
+def my_daemon(spec, stopped, **kwargs):
+ while not stopped:
+ print(f"Object's spec: {spec}")
+ time.sleep(1)
+```
+
+Or the same with the timers:
+
+```python
+import kopf
+
+@kopf.timer('kopfexamples', interval=1)
+def my_timer(spec, **kwargs):
+ print(f"Object's spec: {spec}")
+```
+
+That easy! For more features, see the [documentation](https://kopf.readthedocs.io/).
+
+
+## Usage
+
+Python 3.7+ is required:
+[CPython](https://www.python.org/) and [PyPy](https://www.pypy.org/)
+are officially supported and tested; other Python implementations can work too.
+
+We assume that when the operator is executed in the cluster, it must be packaged
+into a docker image with a CI/CD tool of your preference.
+
+```dockerfile
+FROM python:3.11
+ADD . /src
+RUN pip install kopf
+CMD kopf run /src/handlers.py --verbose
+```
+
+Where `handlers.py` is your Python script with the handlers
+(see `examples/*/example.py` for the examples).
+
+See `kopf run --help` for other ways of attaching the handlers.
+
+
+## Contributing
+
+Please read [CONTRIBUTING.md](https://github.com/nolar/kopf/blob/main/CONTRIBUTING.md)
+for details on our process for submitting pull requests to us, and please ensure
+you follow the [CODE_OF_CONDUCT.md](https://github.com/nolar/kopf/blob/main/CODE_OF_CONDUCT.md).
+
+To install the environment for the local development,
+read [DEVELOPMENT.md](https://github.com/nolar/kopf/blob/main/DEVELOPMENT.md).
+
+
+## Versioning
+
+We use [SemVer](http://semver.org/) for versioning. For the versions available,
+see the [releases on this repository](https://github.com/nolar/kopf/releases).
+
+
+## License
+
+This project is licensed under the MIT License —
+see the [LICENSE](https://github.com/nolar/kopf/blob/main/LICENSE) file for details.
+
+
+## Acknowledgments
+
+* Thanks to Zalando for starting this project in Zalando's Open-Source Incubator
+ in the first place.
+* Thanks to [@side8](https://github.com/side8) and their [k8s-operator](https://github.com/side8/k8s-operator)
+ for inspiration.
+
+
+%package -n python3-kopf
+Summary: Kubernetes Operator Pythonic Framework (Kopf)
+Provides: python-kopf
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-kopf
+# Kubernetes Operator Pythonic Framework (Kopf)
+
+[![Supported Python versions](https://img.shields.io/pypi/pyversions/kopf.svg)](https://pypi.org/project/kopf/)
+[![CI](https://github.com/nolar/kopf/workflows/Thorough%20tests/badge.svg)](https://github.com/nolar/kopf/actions/workflows/thorough.yaml)
+[![codecov](https://codecov.io/gh/nolar/kopf/branch/main/graph/badge.svg)](https://codecov.io/gh/nolar/kopf)
+[![Coverage Status](https://coveralls.io/repos/github/nolar/kopf/badge.svg?branch=main)](https://coveralls.io/github/nolar/kopf?branch=main)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/nolar/kopf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/nolar/kopf/alerts/)
+[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/nolar/kopf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/nolar/kopf/context:python)
+[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
+
+**Kopf** —Kubernetes Operator Pythonic Framework— is a framework and a library
+to make Kubernetes operators development easier, just in a few lines of Python code.
+
+The main goal is to bring the Domain-Driven Design to the infrastructure level,
+with Kubernetes being an orchestrator/database of the domain objects (custom resources),
+and the operators containing the domain logic (with no or minimal infrastructure logic).
+
+The project was originally started as `zalando-incubator/kopf` in March 2019,
+and then forked as `nolar/kopf` in August 2020: but it is the same codebase,
+the same packages, the same developer(s).
+
+
+## Documentation
+
+* https://kopf.readthedocs.io/
+
+
+## Features
+
+* Simple, but powerful:
+ * A full-featured operator in just 2 files: a `Dockerfile` + a Python file (*).
+ * Handling functions registered via decorators with a declarative approach.
+ * No infrastructure boilerplate code with K8s API communication.
+ * Both sync and async handlers, with sync ones being threaded under the hood.
+ * Detailed documentation with examples.
+* Intuitive mapping of Python concepts to Kubernetes concepts and back:
+ * Marshalling of resources' data to the handlers' kwargs.
+ * Marshalling of handlers' results to the resources' statuses.
+ * Publishing of logging messages as Kubernetes events linked to the resources.
+* Support anything that exists in K8s:
+ * Custom K8s resources.
+ * Builtin K8s resources (pods, namespaces, etc).
+ * Multiple resource types in one operator.
+ * Both cluster and namespaced operators.
+* All the ways of handling that a developer can wish for:
+ * Low-level handlers for events received from K8s APIs "as is" (an equivalent of _informers_).
+ * High-level handlers for detected causes of changes (creation, updates with diffs, deletion).
+ * Handling of selected fields only instead of the whole objects (if needed).
+ * Dynamically generated or conditional sub-handlers (an advanced feature).
+ * Timers that tick as long as the resource exists, optionally with a delay since the last change.
+ * Daemons that run as long as the resource exists (in threads or asyncio-tasks).
+ * Validating and mutating admission webhook (with dev-mode tunneling).
+ * Live in-memory indexing of resources or their excerpts.
+ * Filtering with stealth mode (no logging): by arbitrary filtering functions,
+ by labels/annotations with values, presence/absence, or dynamic callbacks.
+ * In-memory all-purpose containers to store non-serializable objects for individual resources.
+* Eventual consistency of handling:
+ * Retrying the handlers in case of arbitrary errors until they succeed.
+ * Special exceptions to request a special retry or to never retry again.
+ * Custom limits for the number of attempts or the time.
+ * Implicit persistence of the progress that survives the operator restarts.
+ * Tolerance to restarts and lengthy downtimes: handles the changes afterwards.
+* Awareness of other Kopf-based operators:
+ * Configurable identities for different Kopf-based operators for the same resource kinds.
+ * Avoiding double-processing due to cross-pod awareness of the same operator ("peering").
+ * Pausing of a deployed operator when a dev-mode operator runs outside of the cluster.
+* Extra toolkits and integrations:
+ * Some limited support for object hierarchies with name/labels propagation.
+ * Friendly to any K8s client libraries (and is client agnostic).
+ * Startup/cleanup operator-level handlers.
+ * Liveness probing endpoints and rudimentary metrics exports.
+ * Basic testing toolkit for in-memory per-test operator running.
+ * Embeddable into other Python applications.
+* Highly configurable (to some reasonable extent).
+
+(*) _Small font: two files of the operator itself, plus some amount of
+deployment files like RBAC roles, bindings, service accounts, network policies
+— everything needed to deploy an application in your specific infrastructure._
+
+
+## Examples
+
+See [examples](https://github.com/nolar/kopf/tree/main/examples)
+for the examples of the typical use-cases.
+
+A minimalistic operator can look like this:
+
+```python
+import kopf
+
+@kopf.on.create('kopfexamples')
+def create_fn(spec, name, meta, status, **kwargs):
+ print(f"And here we are! Created {name} with spec: {spec}")
+```
+
+Numerous kwargs are available, such as `body`, `meta`, `spec`, `status`,
+`name`, `namespace`, `retry`, `diff`, `old`, `new`, `logger`, etc:
+see [Arguments](https://kopf.readthedocs.io/en/latest/kwargs/)
+
+To run a never-exiting function for every resource as long as it exists:
+
+```python
+import time
+import kopf
+
+@kopf.daemon('kopfexamples')
+def my_daemon(spec, stopped, **kwargs):
+ while not stopped:
+ print(f"Object's spec: {spec}")
+ time.sleep(1)
+```
+
+Or the same with the timers:
+
+```python
+import kopf
+
+@kopf.timer('kopfexamples', interval=1)
+def my_timer(spec, **kwargs):
+ print(f"Object's spec: {spec}")
+```
+
+That easy! For more features, see the [documentation](https://kopf.readthedocs.io/).
+
+
+## Usage
+
+Python 3.7+ is required:
+[CPython](https://www.python.org/) and [PyPy](https://www.pypy.org/)
+are officially supported and tested; other Python implementations can work too.
+
+We assume that when the operator is executed in the cluster, it must be packaged
+into a docker image with a CI/CD tool of your preference.
+
+```dockerfile
+FROM python:3.11
+ADD . /src
+RUN pip install kopf
+CMD kopf run /src/handlers.py --verbose
+```
+
+Where `handlers.py` is your Python script with the handlers
+(see `examples/*/example.py` for the examples).
+
+See `kopf run --help` for other ways of attaching the handlers.
+
+
+## Contributing
+
+Please read [CONTRIBUTING.md](https://github.com/nolar/kopf/blob/main/CONTRIBUTING.md)
+for details on our process for submitting pull requests to us, and please ensure
+you follow the [CODE_OF_CONDUCT.md](https://github.com/nolar/kopf/blob/main/CODE_OF_CONDUCT.md).
+
+To install the environment for the local development,
+read [DEVELOPMENT.md](https://github.com/nolar/kopf/blob/main/DEVELOPMENT.md).
+
+
+## Versioning
+
+We use [SemVer](http://semver.org/) for versioning. For the versions available,
+see the [releases on this repository](https://github.com/nolar/kopf/releases).
+
+
+## License
+
+This project is licensed under the MIT License —
+see the [LICENSE](https://github.com/nolar/kopf/blob/main/LICENSE) file for details.
+
+
+## Acknowledgments
+
+* Thanks to Zalando for starting this project in Zalando's Open-Source Incubator
+ in the first place.
+* Thanks to [@side8](https://github.com/side8) and their [k8s-operator](https://github.com/side8/k8s-operator)
+ for inspiration.
+
+
+%package help
+Summary: Development documents and examples for kopf
+Provides: python3-kopf-doc
+%description help
+# Kubernetes Operator Pythonic Framework (Kopf)
+
+[![Supported Python versions](https://img.shields.io/pypi/pyversions/kopf.svg)](https://pypi.org/project/kopf/)
+[![CI](https://github.com/nolar/kopf/workflows/Thorough%20tests/badge.svg)](https://github.com/nolar/kopf/actions/workflows/thorough.yaml)
+[![codecov](https://codecov.io/gh/nolar/kopf/branch/main/graph/badge.svg)](https://codecov.io/gh/nolar/kopf)
+[![Coverage Status](https://coveralls.io/repos/github/nolar/kopf/badge.svg?branch=main)](https://coveralls.io/github/nolar/kopf?branch=main)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/nolar/kopf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/nolar/kopf/alerts/)
+[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/nolar/kopf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/nolar/kopf/context:python)
+[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
+
+**Kopf** —Kubernetes Operator Pythonic Framework— is a framework and a library
+to make Kubernetes operators development easier, just in a few lines of Python code.
+
+The main goal is to bring the Domain-Driven Design to the infrastructure level,
+with Kubernetes being an orchestrator/database of the domain objects (custom resources),
+and the operators containing the domain logic (with no or minimal infrastructure logic).
+
+The project was originally started as `zalando-incubator/kopf` in March 2019,
+and then forked as `nolar/kopf` in August 2020: but it is the same codebase,
+the same packages, the same developer(s).
+
+
+## Documentation
+
+* https://kopf.readthedocs.io/
+
+
+## Features
+
+* Simple, but powerful:
+ * A full-featured operator in just 2 files: a `Dockerfile` + a Python file (*).
+ * Handling functions registered via decorators with a declarative approach.
+ * No infrastructure boilerplate code with K8s API communication.
+ * Both sync and async handlers, with sync ones being threaded under the hood.
+ * Detailed documentation with examples.
+* Intuitive mapping of Python concepts to Kubernetes concepts and back:
+ * Marshalling of resources' data to the handlers' kwargs.
+ * Marshalling of handlers' results to the resources' statuses.
+ * Publishing of logging messages as Kubernetes events linked to the resources.
+* Support anything that exists in K8s:
+ * Custom K8s resources.
+ * Builtin K8s resources (pods, namespaces, etc).
+ * Multiple resource types in one operator.
+ * Both cluster and namespaced operators.
+* All the ways of handling that a developer can wish for:
+ * Low-level handlers for events received from K8s APIs "as is" (an equivalent of _informers_).
+ * High-level handlers for detected causes of changes (creation, updates with diffs, deletion).
+ * Handling of selected fields only instead of the whole objects (if needed).
+ * Dynamically generated or conditional sub-handlers (an advanced feature).
+ * Timers that tick as long as the resource exists, optionally with a delay since the last change.
+ * Daemons that run as long as the resource exists (in threads or asyncio-tasks).
+ * Validating and mutating admission webhook (with dev-mode tunneling).
+ * Live in-memory indexing of resources or their excerpts.
+ * Filtering with stealth mode (no logging): by arbitrary filtering functions,
+ by labels/annotations with values, presence/absence, or dynamic callbacks.
+ * In-memory all-purpose containers to store non-serializable objects for individual resources.
+* Eventual consistency of handling:
+ * Retrying the handlers in case of arbitrary errors until they succeed.
+ * Special exceptions to request a special retry or to never retry again.
+ * Custom limits for the number of attempts or the time.
+ * Implicit persistence of the progress that survives the operator restarts.
+ * Tolerance to restarts and lengthy downtimes: handles the changes afterwards.
+* Awareness of other Kopf-based operators:
+ * Configurable identities for different Kopf-based operators for the same resource kinds.
+ * Avoiding double-processing due to cross-pod awareness of the same operator ("peering").
+ * Pausing of a deployed operator when a dev-mode operator runs outside of the cluster.
+* Extra toolkits and integrations:
+ * Some limited support for object hierarchies with name/labels propagation.
+ * Friendly to any K8s client libraries (and is client agnostic).
+ * Startup/cleanup operator-level handlers.
+ * Liveness probing endpoints and rudimentary metrics exports.
+ * Basic testing toolkit for in-memory per-test operator running.
+ * Embeddable into other Python applications.
+* Highly configurable (to some reasonable extent).
+
+(*) _Small font: two files of the operator itself, plus some amount of
+deployment files like RBAC roles, bindings, service accounts, network policies
+— everything needed to deploy an application in your specific infrastructure._
+
+
+## Examples
+
+See [examples](https://github.com/nolar/kopf/tree/main/examples)
+for the examples of the typical use-cases.
+
+A minimalistic operator can look like this:
+
+```python
+import kopf
+
+@kopf.on.create('kopfexamples')
+def create_fn(spec, name, meta, status, **kwargs):
+ print(f"And here we are! Created {name} with spec: {spec}")
+```
+
+Numerous kwargs are available, such as `body`, `meta`, `spec`, `status`,
+`name`, `namespace`, `retry`, `diff`, `old`, `new`, `logger`, etc:
+see [Arguments](https://kopf.readthedocs.io/en/latest/kwargs/)
+
+To run a never-exiting function for every resource as long as it exists:
+
+```python
+import time
+import kopf
+
+@kopf.daemon('kopfexamples')
+def my_daemon(spec, stopped, **kwargs):
+ while not stopped:
+ print(f"Object's spec: {spec}")
+ time.sleep(1)
+```
+
+Or the same with the timers:
+
+```python
+import kopf
+
+@kopf.timer('kopfexamples', interval=1)
+def my_timer(spec, **kwargs):
+ print(f"Object's spec: {spec}")
+```
+
+That easy! For more features, see the [documentation](https://kopf.readthedocs.io/).
+
+
+## Usage
+
+Python 3.7+ is required:
+[CPython](https://www.python.org/) and [PyPy](https://www.pypy.org/)
+are officially supported and tested; other Python implementations can work too.
+
+We assume that when the operator is executed in the cluster, it must be packaged
+into a docker image with a CI/CD tool of your preference.
+
+```dockerfile
+FROM python:3.11
+ADD . /src
+RUN pip install kopf
+CMD kopf run /src/handlers.py --verbose
+```
+
+Where `handlers.py` is your Python script with the handlers
+(see `examples/*/example.py` for the examples).
+
+See `kopf run --help` for other ways of attaching the handlers.
+
+
+## Contributing
+
+Please read [CONTRIBUTING.md](https://github.com/nolar/kopf/blob/main/CONTRIBUTING.md)
+for details on our process for submitting pull requests to us, and please ensure
+you follow the [CODE_OF_CONDUCT.md](https://github.com/nolar/kopf/blob/main/CODE_OF_CONDUCT.md).
+
+To install the environment for the local development,
+read [DEVELOPMENT.md](https://github.com/nolar/kopf/blob/main/DEVELOPMENT.md).
+
+
+## Versioning
+
+We use [SemVer](http://semver.org/) for versioning. For the versions available,
+see the [releases on this repository](https://github.com/nolar/kopf/releases).
+
+
+## License
+
+This project is licensed under the MIT License —
+see the [LICENSE](https://github.com/nolar/kopf/blob/main/LICENSE) file for details.
+
+
+## Acknowledgments
+
+* Thanks to Zalando for starting this project in Zalando's Open-Source Incubator
+ in the first place.
+* Thanks to [@side8](https://github.com/side8) and their [k8s-operator](https://github.com/side8/k8s-operator)
+ for inspiration.
+
+
+%prep
+%autosetup -n kopf-1.36.0
+
+%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-kopf -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Mon Apr 10 2023 Python_Bot <Python_Bot@openeuler.org> - 1.36.0-1
+- Package Spec generated