diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 41cc896..f60d57c 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -1,11 +1,9 @@ -import json - import kubernetes import urlman from django.conf import settings from django.core.cache import cache from django.core.exceptions import ValidationError -from django.db import IntegrityError, models +from django.db import models from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from encrypted_fields.fields import EncryptedJSONField @@ -494,59 +492,39 @@ class ServiceInstance(ServalaModelMixin, models.Model): def create_instance(cls, name, organization, context, created_by, spec_data): # Ensure the namespace exists context.control_plane.get_or_create_namespace(organization.namespace) - try: - instance = cls.objects.create( - name=name, - organization=organization, - created_by=created_by, - context=context, - ) - except IntegrityError: - raise ValidationError( - _( - "An instance with this name already exists in this organization. Please choose a different name." - ) - ) - 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, - "metadata": { - "name": name, - "namespace": organization.namespace, - }, - "spec": spec_data or {}, - } - if label := context.control_plane.required_label: - create_data["metadata"]["labels"] = [ - {settings.DEFAULT_LABEL_KEY: label} - ] - api_instance = client.CustomObjectsApi( - context.control_plane.get_kubernetes_client() - ) - plural = kind.lower() - if not plural.endswith("s"): - plural = f"{plural}s" + 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, + "metadata": { + "name": name, + "namespace": organization.namespace, + }, + "spec": spec_data or {}, + } + if label := context.control_plane.required_label: + create_data["metadata"]["labels"] = {settings.DEFAULT_LABEL_KEY: label} + 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, - namespace=organization.namespace, - plural=plural, - body=create_data, - ) - except Exception as e: - instance.delete() - if isinstance(e, ApiException): - try: - error_body = json.loads(e.body) - reason = error_body.get("message", str(e)) - raise ValidationError(_("Kubernetes API error: {}").format(reason)) - except (ValueError, TypeError): - raise ValidationError(_("Kubernetes API error: {}").format(str(e))) - raise ValidationError(_("Error creating instance: {}").format(str(e))) - return instance + api_instance.create_namespaced_custom_object( + group=group, + version=version, + namespace=organization.namespace, + plural=plural, + body=create_data, + ) + + return cls.objects.create( + name=name, + organization=organization, + created_by=created_by, + context=context, + ) diff --git a/src/servala/frontend/views/service.py b/src/servala/frontend/views/service.py index edf889a..c19aff5 100644 --- a/src/servala/frontend/views/service.py +++ b/src/servala/frontend/views/service.py @@ -1,5 +1,4 @@ from django.contrib import messages -from django.core.exceptions import ValidationError from django.shortcuts import redirect from django.utils.functional import cached_property from django.views.generic import DetailView, ListView @@ -135,8 +134,6 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView spec_data=form.get_nested_data().get("spec"), ) return redirect(service_instance.urls.base) - except ValidationError as e: - messages.error(self.request, e.message or str(e)) except Exception as e: messages.error(self.request, str(e))