Create Kubernetes CRD using Python dataclasses
Project description
The primary purpose of this project is to simplify working with Kubernetes Custom Resources. To achieve that it provides a base class, kubecrd.KubeResourceBase that can create Python dataclassses into Kubernetes Custom Resources and also generate and install Custom Resource Definitions for those resource into the K8s cluster directly.
>>> from dataclasses import dataclass, field >>> from uuid import UUID >>> from kubecrd import KubeResourceBase >>> from apischema import schema>>> @dataclass ... class Resource(KubeResourceBase): ... __group__ = 'example.com' ... __version__ = 'v1alpha1' ... ... name: str ... tags: list[str] = field( ... default_factory=list, ... metadata=schema( ... description='regroup multiple resources', ... unique=False, ... ), ... )>>> print(Resource.crd_schema()) apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: resources.example.com spec: group: example.com names: kind: Resource plural: resources singular: resource scope: Namespaced versions: - name: v1alpha1 schema: openAPIV3Schema: properties: spec: properties: name: type: string tags: default: [] description: regroup multiple resources items: type: string type: array uniqueItems: false required: - name type: object type: object served: true storage: true <BLANKLINE>
Create CRD in K8s Cluster
It is also possible to install the CRD in a cluster using a Kubernetes Client object:
from from kubernetes import client, config config.load_kube_config() k8s_client = client.ApiClient() Resource.install(k8s_client)
You can then find the resource in the cluster:
» kubectl get crds/resources.example.com NAME CREATED AT resources.example.com 2022-03-20T03:58:25Z $ kubectl api-resources | grep example.com resources example.com/v1alpha1 true Resource
Installation of resource is idempotent, so re-installing an already installed resource doesn’t raise any exceptions if exist_ok=True is passed in:
Resource.install(k8s_client, exist_ok=True)
Serialization
You can serialize a Resource such that it is suitable to POST to K8s:
>>> example = Resource(name='myResource', tags=['tag1', 'tag2']) >>> import json >>> print(json.dumps(example.serialize(), sort_keys=True, indent=4)) { "apiVersion": "example.com/v1alpha1", "kind": "Resource", "metadata": { "name": "..." }, "spec": { "name": "myResource", "tags": [ "tag1", "tag2" ] } }
Objects can also be serialized and saved directly in K8s:
example.save(k8s_client)
Where client in the above is a Kubernetes client object. You can also use asyncio with kubernetes_asyncio client and instead do:
await example.async_save(k8s_async_client)
Deserialization
You can deserialize the JSON from Kubernetes API into Python CR objects.
$ cat -p testdata/cr.json { "apiVersion": "example.com/v1alpha1", "kind": "Resource", "metadata": { "generation": 1, "name": "myresource1", "namespace": "default", "resourceVersion": "105572812", "uid": "02102eb3-968b-418a-8023-75df383daa3c" }, "spec": { "name": "bestID", "tags": [ "tag1", "tag2" ] } }
by using from_json classmethod on the resource:
>>> import json >>> with open('testdata/cr.json') as fd: ... json_schema = json.load(fd) >>> res = Resource.from_json(json_schema) >>> print(res.name) bestID >>> print(res.tags) ['tag1', 'tag2']
This also loads the Kubernetes’s V1ObjectMeta and sets it as the .metadata property of CR:
>>> print(res.metadata.namespace) default >>> print(res.metadata.name) myresource1 >>> print(res.metadata.resource_version) 105572812
Watch
It is possible to Watch for changes in Custom Resources using the standard Watch API in Kubernetes. For example, to watch for all changes in Resources:
async for happened, resource in Resource.async_watch(k8s_async_client): print(f'Resource {resource.metadata.name} was {happened}')
Or you can use the block sync API for the watch:
for happened, resource in Resource.watch(k8s_client): print(f'Resource {resource.metadata.name} was {happened}')
Installing
Kube CRD can be install from PyPI using pip or your favorite tool:
$ pip install kubecrd
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
Built Distribution
File details
Details for the file kubecrd-0.5.0.tar.gz
.
File metadata
- Download URL: kubecrd-0.5.0.tar.gz
- Upload date:
- Size: 10.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 09c903cbb47c66b6ded706a14919d61e87a6753fb425e5b213c3c3fcbb97c320 |
|
MD5 | 0cc0fd37ad7d9c87490d50baa4b64c49 |
|
BLAKE2b-256 | 44f3dec68c8cc004c0c139e4dca40b6a08f68f8544806a2bf2ead45b5fae15e6 |
File details
Details for the file kubecrd-0.5.0-py3-none-any.whl
.
File metadata
- Download URL: kubecrd-0.5.0-py3-none-any.whl
- Upload date:
- Size: 9.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f3cc3d3e60ab1e830bb3bba7206015320901d9f3a355d970dcb17886ab321f11 |
|
MD5 | edfc2df7cedeee13e871bc90ef1e3029 |
|
BLAKE2b-256 | 0c627a9f04d82a6c54c0e280aa2da8519ecb3f913048005a6584cb71002acc95 |