Browse Source

Fixes #1699: Correct nested representation in the API of primary IPs for virtual machines and add missing primary_ip property

Jeremy Stretch 7 years ago
parent
commit
a1b1e261de
2 changed files with 27 additions and 2 deletions
  1. 15 2
      netbox/virtualization/api/serializers.py
  2. 12 0
      netbox/virtualization/models.py

+ 15 - 2
netbox/virtualization/api/serializers.py

@@ -6,6 +6,7 @@ from dcim.api.serializers import NestedDeviceRoleSerializer, NestedPlatformSeria
 from dcim.constants import IFACE_FF_VIRTUAL
 from dcim.models import Interface
 from extras.api.customfields import CustomFieldModelSerializer
+from ipam.models import IPAddress
 from tenancy.api.serializers import NestedTenantSerializer
 from utilities.api import ChoiceFieldSerializer, ValidatedModelSerializer
 from virtualization.constants import STATUS_CHOICES
@@ -83,18 +84,30 @@ class WritableClusterSerializer(CustomFieldModelSerializer):
 # Virtual machines
 #
 
+# Cannot import ipam.api.NestedIPAddressSerializer due to circular dependency
+class VirtualMachineIPAddressSerializer(serializers.ModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')
+
+    class Meta:
+        model = IPAddress
+        fields = ['id', 'url', 'family', 'address']
+
+
 class VirtualMachineSerializer(CustomFieldModelSerializer):
     status = ChoiceFieldSerializer(choices=STATUS_CHOICES)
     cluster = NestedClusterSerializer()
     role = NestedDeviceRoleSerializer()
     tenant = NestedTenantSerializer()
     platform = NestedPlatformSerializer()
+    primary_ip = VirtualMachineIPAddressSerializer()
+    primary_ip4 = VirtualMachineIPAddressSerializer()
+    primary_ip6 = VirtualMachineIPAddressSerializer()
 
     class Meta:
         model = VirtualMachine
         fields = [
-            'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'vcpus',
-            'memory', 'disk', 'comments', 'custom_fields',
+            'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6',
+            'vcpus', 'memory', 'disk', 'comments', 'custom_fields',
         ]
 
 

+ 12 - 0
netbox/virtualization/models.py

@@ -1,5 +1,6 @@
 from __future__ import unicode_literals
 
+from django.conf import settings
 from django.contrib.contenttypes.fields import GenericRelation
 from django.core.exceptions import ValidationError
 from django.db import models
@@ -255,3 +256,14 @@ class VirtualMachine(CreatedUpdatedModel, CustomFieldModel):
 
     def get_status_class(self):
         return VM_STATUS_CLASSES[self.status]
+
+    @property
+    def primary_ip(self):
+        if settings.PREFER_IPV4 and self.primary_ip4:
+            return self.primary_ip4
+        elif self.primary_ip6:
+            return self.primary_ip6
+        elif self.primary_ip4:
+            return self.primary_ip4
+        else:
+            return None