diff --git a/src/servala/core/admin.py b/src/servala/core/admin.py index dad3d6e..7d110d1 100644 --- a/src/servala/core/admin.py +++ b/src/servala/core/admin.py @@ -131,7 +131,7 @@ class ControlPlaneAdmin(admin.ModelAdmin): fieldsets = ( ( None, - {"fields": ("name", "description", "cloud_provider")}, + {"fields": ("name", "description", "cloud_provider", "required_label")}, ), ( _("API Credentials"), diff --git a/src/servala/core/migrations/0002_alter_controlplanecrd_options_and_more.py b/src/servala/core/migrations/0002_alter_controlplanecrd_options_and_more.py new file mode 100644 index 0000000..63cab45 --- /dev/null +++ b/src/servala/core/migrations/0002_alter_controlplanecrd_options_and_more.py @@ -0,0 +1,31 @@ +# Generated by Django 5.2b1 on 2025-04-03 15:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0001_initial"), + ] + + operations = [ + migrations.AlterModelOptions( + name="controlplanecrd", + options={ + "verbose_name": "ControlPlane CRD", + "verbose_name_plural": "ControlPlane CRDs", + }, + ), + migrations.AddField( + model_name="controlplane", + name="required_label", + field=models.CharField( + blank=True, + help_text="Label value for the 'appcat.vshn.io/provider-config' added to every instance on this plane.", + max_length=100, + null=True, + verbose_name="Required Label", + ), + ), + ] diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 8156adf..f9afedc 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -1,5 +1,6 @@ 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 models @@ -106,6 +107,15 @@ class ControlPlane(ServalaModelMixin, models.Model): help_text="Required fields: certificate-authority-data, server (URL), token", validators=[validate_api_credentials], ) + required_label = models.CharField( + max_length=100, + blank=True, + null=True, + verbose_name=_("Required Label"), + help_text=_( + "Label value for the 'appcat.vshn.io/provider-config' added to every instance on this plane." + ), + ) cloud_provider = models.ForeignKey( to="CloudProvider", @@ -495,6 +505,8 @@ class ServiceInstance(ServalaModelMixin, models.Model): }, "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() ) diff --git a/src/servala/settings.py b/src/servala/settings.py index 3e27e35..50b0c5e 100644 --- a/src/servala/settings.py +++ b/src/servala/settings.py @@ -210,6 +210,7 @@ LANGUAGE_COOKIE_NAME = "servala_lang" SESSION_COOKIE_NAME = "servala_sess" SESSION_COOKIE_SECURE = not DEBUG +DEFAULT_LABEL_KEY = "appcat.vshn.io/provider-config" DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # TODO