diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index b53734734..078df19b6 100644 --- a/netbox/virtualization/api/serializers.py +++ b/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', ] diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 8fb13c7cc..edb35f4cb 100644 --- a/netbox/virtualization/models.py +++ b/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