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