From 4d3278cb52500b1ff64a4d92e5eb5ddcd43f89c0 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 6 Jul 2022 13:31:31 -0400 Subject: [PATCH] #8157: Clean up L2VPN assignment for VM interfaces --- netbox/dcim/api/serializers.py | 4 ++-- netbox/templates/ipam/l2vpntermination.html | 6 +++--- netbox/virtualization/api/serializers.py | 9 ++++++--- netbox/virtualization/models.py | 10 ++++++++++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index fcee81615..4cb988c42 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -9,8 +9,8 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from ipam.api.nested_serializers import ( - NestedASNSerializer, NestedIPAddressSerializer, NestedVLANSerializer, NestedVRFSerializer, - NestedL2VPNTerminationSerializer, + NestedASNSerializer, NestedIPAddressSerializer, NestedL2VPNTerminationSerializer, NestedVLANSerializer, + NestedVRFSerializer, ) from ipam.models import ASN, VLAN from netbox.api import ChoiceField, ContentTypeField, SerializedPKRelatedField diff --git a/netbox/templates/ipam/l2vpntermination.html b/netbox/templates/ipam/l2vpntermination.html index 22e0cc324..b34d1a710 100644 --- a/netbox/templates/ipam/l2vpntermination.html +++ b/netbox/templates/ipam/l2vpntermination.html @@ -11,12 +11,12 @@
- - + + - +
L2vPN{{ object.l2vpn.name|placeholder }}L2VPN{{ object.l2vpn|linkify }}
Assigned Object{{ object.assigned_object.name|placeholder }}{{ object.assigned_object|linkify }}
diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index bd01b5533..c5816dca8 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -5,7 +5,9 @@ from dcim.api.nested_serializers import ( NestedDeviceSerializer, NestedDeviceRoleSerializer, NestedPlatformSerializer, NestedSiteSerializer, ) from dcim.choices import InterfaceModeChoices -from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer, NestedVRFSerializer +from ipam.api.nested_serializers import ( + NestedIPAddressSerializer, NestedL2VPNTerminationSerializer, NestedVLANSerializer, NestedVRFSerializer, +) from ipam.models import VLAN from netbox.api import ChoiceField, SerializedPKRelatedField from netbox.api.serializers import NetBoxModelSerializer @@ -121,6 +123,7 @@ class VMInterfaceSerializer(NetBoxModelSerializer): many=True ) vrf = NestedVRFSerializer(required=False, allow_null=True) + l2vpn_termination = NestedL2VPNTerminationSerializer(read_only=True) count_ipaddresses = serializers.IntegerField(read_only=True) count_fhrp_groups = serializers.IntegerField(read_only=True) @@ -128,8 +131,8 @@ class VMInterfaceSerializer(NetBoxModelSerializer): model = VMInterface fields = [ 'id', 'url', 'display', 'virtual_machine', 'name', 'enabled', 'parent', 'bridge', 'mtu', 'mac_address', - 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', 'custom_fields', 'created', - 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', + 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'vrf', 'l2vpn_termination', 'tags', 'custom_fields', + 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', ] def validate(self, data): diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 02560a962..98321976f 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -440,6 +440,12 @@ class VMInterface(NetBoxModel, BaseInterface): object_id_field='interface_id', related_query_name='+' ) + l2vpn_terminations = GenericRelation( + to='ipam.L2VPNTermination', + content_type_field='assigned_object_type', + object_id_field='assigned_object_id', + related_query_name='vminterface', + ) class Meta: verbose_name = 'interface' @@ -498,3 +504,7 @@ class VMInterface(NetBoxModel, BaseInterface): @property def parent_object(self): return self.virtual_machine + + @property + def l2vpn_termination(self): + return self.l2vpn_terminations.first()