From 0eb07feeef8c367dc05e9cf9821e986d72c058ac Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Fri, 11 Apr 2025 09:14:58 +0200 Subject: [PATCH] Refactor access to group/version/kind --- src/servala/core/models/service.py | 54 +++++++++++++++++------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 82d00da..d421f8b 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -355,11 +355,27 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model): def __str__(self): 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 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() extensions_api = kubernetes.client.ApiextensionsV1Api(client) @@ -368,10 +384,10 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model): for crd in crds.items: if matching_crd: break - if crd.spec.group == group: + if crd.spec.group == self.group: for served_version in crd.spec.versions: - if served_version.name == version and served_version.served: - if crd.spec.names.kind == kind: + if served_version.name == self.version and served_version.served: + if crd.spec.names.kind == self.kind: matching_crd = crd break return matching_crd @@ -382,9 +398,8 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model): if result := cache.get(cache_key): return result - version = self.service_definition.api_definition["version"] 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() timeout_seconds = 60 * 60 * 24 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 kwargs = { - key: value - for key, value in self.service_definition.api_definition.items() - if key in ("group", "version", "kind") + "group": self.group, + "version": self.version, + "kind": self.kind, } return generate_django_model(self.resource_schema, **kwargs) @@ -517,12 +532,9 @@ class ServiceInstance(ServalaModelMixin, models.Model): ) try: - group = context.service_definition.api_definition["group"] - version = context.service_definition.api_definition["version"] - kind = context.service_definition.api_definition["kind"] create_data = { - "apiVersion": f"{group}/{version}", - "kind": kind, + "apiVersion": f"{context.group}/{context.version}", + "kind": context.kind, "metadata": { "name": name, "namespace": organization.namespace, @@ -534,15 +546,11 @@ class ServiceInstance(ServalaModelMixin, models.Model): api_instance = client.CustomObjectsApi( context.control_plane.get_kubernetes_client() ) - plural = kind.lower() - if not plural.endswith("s"): - plural = f"{plural}s" - api_instance.create_namespaced_custom_object( - group=group, - version=version, + group=context.group, + version=context.version, namespace=organization.namespace, - plural=plural, + plural=context.kind_plural, body=create_data, ) except Exception as e: