Refactor access to group/version/kind

This commit is contained in:
Tobias Kunze 2025-04-11 09:14:58 +02:00
parent 55f6169562
commit 0eb07feeef

View file

@ -355,11 +355,27 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model):
def __str__(self): def __str__(self):
return f"{self.service_offering} on {self.control_plane} with {self.service_definition}" return f"{self.service_offering} on {self.control_plane} with {self.service_definition}"
@cached_property
def group(self):
return self.service_definition.api_definition["group"]
@cached_property
def version(self):
return self.service_definition.api_definition["version"]
@cached_property
def kind(self):
return self.service_definition.api_definition["kind"]
@cached_property
def kind_plural(self):
plural = self.kind.lower()
if not plural.endswith("s"):
plural = f"{plural}s"
return plural
@cached_property @cached_property
def resource_definition(self): def resource_definition(self):
kind = self.service_definition.api_definition["kind"]
group = self.service_definition.api_definition["group"]
version = self.service_definition.api_definition["version"]
client = self.control_plane.get_kubernetes_client() client = self.control_plane.get_kubernetes_client()
extensions_api = kubernetes.client.ApiextensionsV1Api(client) extensions_api = kubernetes.client.ApiextensionsV1Api(client)
@ -368,10 +384,10 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model):
for crd in crds.items: for crd in crds.items:
if matching_crd: if matching_crd:
break break
if crd.spec.group == group: if crd.spec.group == self.group:
for served_version in crd.spec.versions: for served_version in crd.spec.versions:
if served_version.name == version and served_version.served: if served_version.name == self.version and served_version.served:
if crd.spec.names.kind == kind: if crd.spec.names.kind == self.kind:
matching_crd = crd matching_crd = crd
break break
return matching_crd return matching_crd
@ -382,9 +398,8 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model):
if result := cache.get(cache_key): if result := cache.get(cache_key):
return result return result
version = self.service_definition.api_definition["version"]
for v in self.resource_definition.spec.versions: for v in self.resource_definition.spec.versions:
if v.name == version: if v.name == self.version:
result = v.schema.open_apiv3_schema.to_dict() result = v.schema.open_apiv3_schema.to_dict()
timeout_seconds = 60 * 60 * 24 timeout_seconds = 60 * 60 * 24
cache.set(cache_key, result, timeout=timeout_seconds) cache.set(cache_key, result, timeout=timeout_seconds)
@ -395,9 +410,9 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model):
from servala.core.crd import generate_django_model from servala.core.crd import generate_django_model
kwargs = { kwargs = {
key: value "group": self.group,
for key, value in self.service_definition.api_definition.items() "version": self.version,
if key in ("group", "version", "kind") "kind": self.kind,
} }
return generate_django_model(self.resource_schema, **kwargs) return generate_django_model(self.resource_schema, **kwargs)
@ -517,12 +532,9 @@ class ServiceInstance(ServalaModelMixin, models.Model):
) )
try: try:
group = context.service_definition.api_definition["group"]
version = context.service_definition.api_definition["version"]
kind = context.service_definition.api_definition["kind"]
create_data = { create_data = {
"apiVersion": f"{group}/{version}", "apiVersion": f"{context.group}/{context.version}",
"kind": kind, "kind": context.kind,
"metadata": { "metadata": {
"name": name, "name": name,
"namespace": organization.namespace, "namespace": organization.namespace,
@ -534,15 +546,11 @@ class ServiceInstance(ServalaModelMixin, models.Model):
api_instance = client.CustomObjectsApi( api_instance = client.CustomObjectsApi(
context.control_plane.get_kubernetes_client() context.control_plane.get_kubernetes_client()
) )
plural = kind.lower()
if not plural.endswith("s"):
plural = f"{plural}s"
api_instance.create_namespaced_custom_object( api_instance.create_namespaced_custom_object(
group=group, group=context.group,
version=version, version=context.version,
namespace=organization.namespace, namespace=organization.namespace,
plural=plural, plural=context.kind_plural,
body=create_data, body=create_data,
) )
except Exception as e: except Exception as e: