From 3ffb4b5de8b3a4470aa77d2c969f09d9a5152f77 Mon Sep 17 00:00:00 2001 From: Arkadiusz Szczecinski <arkadiusz.szczecinski@ext.ec.europa.eu> Date: Thu, 16 Jan 2025 11:54:57 +0100 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20Add=20initial=20version=20of=20?= =?UTF-8?q?extended=20VM=20API=20endpoint=20including=20all=20related=20wi?= =?UTF-8?q?ht=20SYS=20plugin=20objects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/netbox | 1 + netbox_sys_plugin/api/nested_serializers.py | 26 ++++++++++- netbox_sys_plugin/api/serializers.py | 48 +++++++++++++++++---- netbox_sys_plugin/api/urls.py | 4 +- 4 files changed, 68 insertions(+), 11 deletions(-) create mode 160000 lib/netbox diff --git a/lib/netbox b/lib/netbox new file mode 160000 index 0000000..0c06725 --- /dev/null +++ b/lib/netbox @@ -0,0 +1 @@ +Subproject commit 0c0672550a52085de8637d2d47c7cd64936efd22 diff --git a/netbox_sys_plugin/api/nested_serializers.py b/netbox_sys_plugin/api/nested_serializers.py index c301f8d..3b6182f 100644 --- a/netbox_sys_plugin/api/nested_serializers.py +++ b/netbox_sys_plugin/api/nested_serializers.py @@ -1,7 +1,7 @@ from drf_spectacular.utils import extend_schema_serializer from netbox.api.serializers import WritableNestedSerializer from virtualization.models import VirtualMachine, Cluster, ClusterType -from .. models import VirtualMachineMaintenance, ProviderCredentials,VmAssignedVirtualMachineType, VirtualMachineType +from .. models import VirtualMachineMaintenance, ProviderCredentials,VmAssignedVirtualMachineType, VirtualMachineType, DomainNames, VmAssignedExtraConfig, WebhookSettings, ProviderTypeExtraConfig from rest_framework import serializers from netbox.api.serializers import WritableNestedSerializer @@ -15,6 +15,10 @@ __all__ = [ 'NestedVirtualMachineTypeSerializer', 'NestedTenantGroupSerializer', 'NestedTenantSerializer', + 'NestedDomainNamesSerializer', + 'NestedVmAssignedExtraConfigSerializer', + 'NestedWebhookSettingsSerializer', + 'NestedProviderTypeExtraConfigSerializer', ] @@ -63,3 +67,23 @@ class NestedTenantSerializer(WritableNestedSerializer): model = Tenant fields = ['id', 'url', 'display', 'name', 'slug'] + +class NestedDomainNamesSerializer(WritableNestedSerializer): + class Meta: + model = DomainNames + fields = '__all__' + +class NestedVmAssignedExtraConfigSerializer(WritableNestedSerializer): + class Meta: + model = VmAssignedExtraConfig + fields = '__all__' + +class NestedWebhookSettingsSerializer(WritableNestedSerializer): + class Meta: + model = WebhookSettings + fields = '__all__' + +class NestedProviderTypeExtraConfigSerializer(WritableNestedSerializer): + class Meta: + model = ProviderTypeExtraConfig + fields = '__all__' diff --git a/netbox_sys_plugin/api/serializers.py b/netbox_sys_plugin/api/serializers.py index 9c73e45..df4c790 100644 --- a/netbox_sys_plugin/api/serializers.py +++ b/netbox_sys_plugin/api/serializers.py @@ -20,8 +20,21 @@ class VirtualMachineSerializer(serializers.ModelSerializer): model = VirtualMachine fields = ['id', 'name'] +class ClusterTypeSerializer(serializers.ModelSerializer): + provider_type_extra_config = serializers.SerializerMethodField() + class Meta: + model = ClusterType + fields = ['id', 'name', 'provider_type_extra_config'] + + def get_provider_type_extra_config(self, obj): + provider_type_extra_config = ProviderTypeExtraConfig.objects.filter(assigned_object_type=ContentType.objects.get_for_model(ClusterType), + assigned_object_id=obj.id) + return NestedProviderTypeExtraConfigSerializer(provider_type_extra_config, many=True).data + class ClusterSerializer(serializers.ModelSerializer): + cluster_type = serializers.SerializerMethodField() provider_credentials = serializers.SerializerMethodField() + class Meta: model = Cluster fields = '__all__' @@ -33,11 +46,9 @@ class ClusterSerializer(serializers.ModelSerializer): assigned_object_id=obj.id ) return NestedProviderCredentialsSerializer(provider_credentials, many=True).data - -class ClusterTypeSerializer(serializers.ModelSerializer): - class Meta: - model = ClusterType - fields = ['id', 'name'] + + def get_cluster_type(self, obj): + return ClusterTypeSerializer(obj.type).data #Plugin Data Serializer class VirtualMachineMaintenanceSerializer(NetBoxModelSerializer): @@ -131,7 +142,7 @@ class VmAssignedExtraConfigSerializer(NetBoxModelSerializer): fields = '__all__' class VirtualMachineSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail') + url = serializers.HyperlinkedIdentityField(view_name='plugins-api:netbox_sys_plugin-api:virtualmachine-detail') status = ChoiceField(choices=VirtualMachineStatusChoices, required=False) site = NestedSiteSerializer(required=False, allow_null=True) cluster = ClusterSerializer(required=False, allow_null=True) @@ -146,6 +157,11 @@ class VirtualMachineSerializer(NetBoxModelSerializer): # config_template = NestedConfigTemplateSerializer(required=False, allow_null=True, default=None) virtual_machine_maintenance = serializers.SerializerMethodField() virtual_machine_types = serializers.SerializerMethodField() + + domain_names = serializers.SerializerMethodField() + vm_assigned_extra_config = serializers.SerializerMethodField() + # webhook_settings = NestedWebhookSettingsSerializer(many=True, read_only=True) + # provider_type_extra_config = serializers.SerializerMethodField() # Counter fields interface_count = serializers.IntegerField(read_only=True) @@ -156,9 +172,10 @@ class VirtualMachineSerializer(NetBoxModelSerializer): 'id', 'url', 'display', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'comments', 'config_template', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', - 'services', 'virtual_machine_maintenance', 'virtual_machine_types', 'interface_count', + 'services', 'virtual_machine_maintenance', 'virtual_machine_types', 'interface_count','domain_names', + 'vm_assigned_extra_config', + ] - # depth = 2 def get_virtual_machine_maintenance(self, obj): virtual_machine_maintenance = VirtualMachineMaintenance.objects.filter( @@ -175,3 +192,18 @@ class VirtualMachineSerializer(NetBoxModelSerializer): return NestedVirtualMachineTypeSerializer( [item.virtual_machine_type for item in vm_assigned_types], many=True ).data + + def get_domain_names(self, obj): + domain_names = DomainNames.objects.filter(assigned_object_type=ContentType.objects.get_for_model(VirtualMachine), + assigned_object_id=obj.id) + return NestedDomainNamesSerializer(domain_names, many=True).data + + def get_vm_assigned_extra_config(self, obj): + vm_assigned_extra_config = VmAssignedExtraConfig.objects.filter(assigned_object_type=ContentType.objects.get_for_model(VirtualMachine), + assigned_object_id=obj.id) + return NestedVmAssignedExtraConfigSerializer(vm_assigned_extra_config, many=True).data + + # def get_provider_type_extra_config(self, obj): + # provider_type_extra_config = ProviderTypeExtraConfig.objects.filter(assigned_object_type=ContentType.objects.get_for_model(VirtualMachine), + # assigned_object_id=obj.id) + # return NestedProviderTypeExtraConfigSerializer(provider_type_extra_config, many=True).data \ No newline at end of file diff --git a/netbox_sys_plugin/api/urls.py b/netbox_sys_plugin/api/urls.py index cd2d3e1..47e62cc 100644 --- a/netbox_sys_plugin/api/urls.py +++ b/netbox_sys_plugin/api/urls.py @@ -9,10 +9,10 @@ router.register(r'VmType', VirtualMachineTypeViewSet) router.register(r'DomainNames', DomainNamesViewSet) router.register(r'WebhookSettings', WebhookSettingsViewSet) router.register(r'ProviderTypeExtraConfig', ProviderTypeExtraConfigViewSet) -router.register(r'VirtualMachine', VirtualMachineViewSet) +router.register(r'VirtualMachine', VirtualMachineViewSet, basename='virtualmachine') router.register(r'ExtraConfig', ProviderTypeExtraConfigViewSet) router.register(r'AssignedExtraConfig', VmAssignedExtraConfigViewSet) -app_name = "netbox_sys_plugin" +app_name = 'netbox_sys_plugin' urlpatterns = router.urls -- GitLab From d2a6d19b2e4d8a3780ba44bc0b0534dda9e0389d Mon Sep 17 00:00:00 2001 From: Arkadiusz Szczecinski <arkadiusz.szczecinski@ext.ec.europa.eu> Date: Thu, 16 Jan 2025 13:06:48 +0100 Subject: [PATCH 2/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20nested=20se?= =?UTF-8?q?rializers=20for=20VirtualMachine=20and=20related=20models?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + netbox_sys_plugin/api/nested_serializers.py | 20 +++++++++++++------- netbox_sys_plugin/api/serializers.py | 18 +++++------------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 24c94ab..3831259 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ __pycache__ local/ dist/ venv/ +lib/ docs/definition/build/ \ No newline at end of file diff --git a/netbox_sys_plugin/api/nested_serializers.py b/netbox_sys_plugin/api/nested_serializers.py index 3b6182f..1372abf 100644 --- a/netbox_sys_plugin/api/nested_serializers.py +++ b/netbox_sys_plugin/api/nested_serializers.py @@ -9,6 +9,7 @@ from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMac from tenancy.models import * __all__ = [ + 'NestedVirtualMachineSerializer', 'NestedVirtualMachineMaintenanceSerializer', 'NestedProviderCredentialsSerializer', 'NestedVmAssignedVirtualMachineTypeSerializer', @@ -22,6 +23,11 @@ __all__ = [ ] +class NestedVirtualMachineSerializer(serializers.ModelSerializer): + class Meta: + model = VirtualMachine + fields = ['id', 'name'] + class NestedVirtualMachineMaintenanceSerializer(WritableNestedSerializer): class Meta: model = VirtualMachineMaintenance @@ -30,7 +36,7 @@ class NestedVirtualMachineMaintenanceSerializer(WritableNestedSerializer): class NestedProviderCredentialsSerializer(WritableNestedSerializer): class Meta: model = ProviderCredentials - fields = '__all__' + fields = ['id', 'provider_username', 'provider_password_vault_path', 'created', 'last_updated'] class NestedVirtualMachineTypeSerializer(WritableNestedSerializer): class Meta: @@ -45,7 +51,7 @@ class NestedVmAssignedVirtualMachineTypeSerializer(WritableNestedSerializer): # virtual_machine_type = VirtualMachineTypeSimpleSerializer() class Meta: model = VirtualMachineType - fields = ["id","display","created","custom_field_data","virtual_machine_type_name","virtual_machine_type_desc"] + fields = ['id', 'virtual_machine_type_name', 'virtual_machine_type_desc', 'created', 'last_updated' ] @extend_schema_serializer( exclude_fields=('tenant_count',), @@ -57,7 +63,7 @@ class NestedTenantGroupSerializer(WritableNestedSerializer): class Meta: model = TenantGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'tenant_count', '_depth'] + fields = ['id', 'url', 'display', 'name', 'slug', 'tenant_count', '_depth', 'created', 'last_updated'] class NestedTenantSerializer(WritableNestedSerializer): @@ -65,18 +71,18 @@ class NestedTenantSerializer(WritableNestedSerializer): class Meta: model = Tenant - fields = ['id', 'url', 'display', 'name', 'slug'] + fields = ['id', 'url', 'display', 'name', 'slug', 'created', 'last_updated'] class NestedDomainNamesSerializer(WritableNestedSerializer): class Meta: model = DomainNames - fields = '__all__' + fields = ['id', 'domain_names', 'created', 'last_updated'] class NestedVmAssignedExtraConfigSerializer(WritableNestedSerializer): class Meta: model = VmAssignedExtraConfig - fields = '__all__' + fields = ['id', 'extra_config_values', 'created', 'last_updated'] class NestedWebhookSettingsSerializer(WritableNestedSerializer): class Meta: @@ -86,4 +92,4 @@ class NestedWebhookSettingsSerializer(WritableNestedSerializer): class NestedProviderTypeExtraConfigSerializer(WritableNestedSerializer): class Meta: model = ProviderTypeExtraConfig - fields = '__all__' + fields = ['id', 'extra_config_name', 'extra_config_description', 'extra_config_structure', 'created', 'last_updated'] \ No newline at end of file diff --git a/netbox_sys_plugin/api/serializers.py b/netbox_sys_plugin/api/serializers.py index df4c790..49100c8 100644 --- a/netbox_sys_plugin/api/serializers.py +++ b/netbox_sys_plugin/api/serializers.py @@ -15,10 +15,6 @@ from virtualization.choices import * from netbox.api.serializers import NetBoxModelSerializer #Netbox Data Serializer -class VirtualMachineSerializer(serializers.ModelSerializer): - class Meta: - model = VirtualMachine - fields = ['id', 'name'] class ClusterTypeSerializer(serializers.ModelSerializer): provider_type_extra_config = serializers.SerializerMethodField() @@ -53,7 +49,7 @@ class ClusterSerializer(serializers.ModelSerializer): #Plugin Data Serializer class VirtualMachineMaintenanceSerializer(NetBoxModelSerializer): id = serializers.IntegerField(read_only=True) - virtual_machine = VirtualMachineSerializer(source='assigned_object', read_only=True) + virtual_machine = NestedVirtualMachineSerializer(source='assigned_object', read_only=True) assigned_object_id = serializers.IntegerField(write_only=True) assigned_object_type = serializers.PrimaryKeyRelatedField( queryset=ContentType.objects.all(), @@ -94,7 +90,7 @@ class VirtualMachineTypeSerializer(NetBoxModelSerializer): class VmAssignedVirtualMachineTypeSerializer(NetBoxModelSerializer): id = serializers.IntegerField(read_only=True) - virtual_machine = VirtualMachineSerializer(source='assigned_object', read_only=True) + virtual_machine = NestedVirtualMachineSerializer(source='assigned_object', read_only=True) virtual_machine_type = VirtualMachineTypeSerializer() assigned_object_id = serializers.IntegerField(write_only=True) assigned_object_type = serializers.CharField(write_only=True) @@ -106,7 +102,7 @@ class VmAssignedVirtualMachineTypeSerializer(NetBoxModelSerializer): class DomainNamesSerializer(NetBoxModelSerializer): id = serializers.IntegerField(read_only=True) - virtual_machine = VirtualMachineSerializer(source='assigned_object', read_only=True) + virtual_machine = NestedVirtualMachineSerializer(source='assigned_object', read_only=True) assigned_object_id = serializers.IntegerField(write_only=True) assigned_object_type = serializers.CharField(write_only=True) display = serializers.CharField(source="__str__") @@ -132,7 +128,7 @@ class ProviderTypeExtraConfigSerializer(NetBoxModelSerializer): class VmAssignedExtraConfigSerializer(NetBoxModelSerializer): id = serializers.IntegerField(read_only=True) - virtual_machine = VirtualMachineSerializer(source='assigned_object', read_only=True) + virtual_machine = NestedVirtualMachineSerializer(source='assigned_object', read_only=True) assigned_object_id = serializers.IntegerField(write_only=True) assigned_object_type = serializers.CharField(write_only=True) display = serializers.CharField(source="__str__") @@ -202,8 +198,4 @@ class VirtualMachineSerializer(NetBoxModelSerializer): vm_assigned_extra_config = VmAssignedExtraConfig.objects.filter(assigned_object_type=ContentType.objects.get_for_model(VirtualMachine), assigned_object_id=obj.id) return NestedVmAssignedExtraConfigSerializer(vm_assigned_extra_config, many=True).data - - # def get_provider_type_extra_config(self, obj): - # provider_type_extra_config = ProviderTypeExtraConfig.objects.filter(assigned_object_type=ContentType.objects.get_for_model(VirtualMachine), - # assigned_object_id=obj.id) - # return NestedProviderTypeExtraConfigSerializer(provider_type_extra_config, many=True).data \ No newline at end of file + \ No newline at end of file -- GitLab From dd4000b26fdd1668033d48389fd65d9e97072c3d Mon Sep 17 00:00:00 2001 From: Arkadiusz Szczecinski <arkadiusz.szczecinski@ext.ec.europa.eu> Date: Thu, 16 Jan 2025 13:20:25 +0100 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=97=91=EF=B8=8F=20exclude=20netbox=20?= =?UTF-8?q?code=20from=20plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- lib/netbox | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 160000 lib/netbox diff --git a/.gitignore b/.gitignore index 3831259..72772c3 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ local/ dist/ venv/ lib/ -docs/definition/build/ \ No newline at end of file +docs/definition/build/ diff --git a/lib/netbox b/lib/netbox deleted file mode 160000 index 0c06725..0000000 --- a/lib/netbox +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0c0672550a52085de8637d2d47c7cd64936efd22 -- GitLab