Skip to content

Custom Resources

For simple custom resources, it might be easiest to use Generic Resources.

If you want to work with more complex custom resources, or you want the added type safety of fully defined types, you can define your own Custom Resources.

Defining your own Custom Resources

First you must define the models that make up your Custom Resource:

from typing import Optional

from lightkube.core.schema import DictMixin, dataclass
from lightkube.models import meta_v1


@dataclass
class Owner(DictMixin):
    name: str


@dataclass
class DogSpec(DictMixin):
    breed: str
    owner: Owner


@dataclass
class DogStatus(DictMixin):
    conditions: Optional[list[meta_v1.Condition]] = None
    observedGeneration: Optional[int] = None


@dataclass
class Dog(DictMixin):
    apiVersion: Optional[str] = None
    kind: Optional[str] = None
    metadata: Optional[meta_v1.ObjectMeta] = None
    spec: Optional[DogSpec] = None
    status: Optional[DogStatus] = None

To be able to use these models as resources in the client, you must create the corresponding Resource subclasses:

from typing import ClassVar

from lightkube.codecs import resource_registry
from lightkube.core import resource as res

from ..models import dog as m_dog


# Only needed if your custom resource has a status subresource
class DogStatus(res.NamespacedSubResource, m_dog.Dog):
    _api_info = res.ApiInfo(
        resource=res.ResourceDef('stable.example.com', 'v1', 'Dog'),
        parent=res.ResourceDef('stable.example.com', 'v1', 'Dog'),
        plural='dogs',
        verbs=['get', 'patch', 'put'],
        action='status',
    )


@resource_registry.register
class Dog(res.NamespacedResourceG, m_dog.Dog):
    _api_info = res.ApiInfo(
        resource=res.ResourceDef('stable.example.com', 'v1', 'Dog'),
        plural='dogs',
        verbs=[
            'delete', 'deletecollection', 'get', 'global_list', 'global_watch', 
            'list', 'patch', 'post', 'put', 'watch'
        ],
    )

    # Only needed if your custom resource has a status subresource
    Status: ClassVar = DogStatus

Once you have defined your custom resource, you can use it with the Client as you would with any other resource.