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):
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: