Skip to content

Commit d2fea4e

Browse files
Closes netbox-community#14311: Move L2VPN models from ipam to vpn (netbox-community#14358)
* Move L2VPN and L2VPNTermination models from ipam to vpn * Move L2VPN resources from ipam to vpn * Extend migration to update content types * Misc cleanup
1 parent 8e7146c commit d2fea4e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1616
-1441
lines changed

netbox/dcim/api/serializers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
from django.contrib.contenttypes.models import ContentType
44
from django.utils.translation import gettext as _
5-
from drf_spectacular.utils import extend_schema_field
65
from drf_spectacular.types import OpenApiTypes
6+
from drf_spectacular.utils import extend_schema_field
77
from rest_framework import serializers
88
from timezone_field.rest_framework import TimeZoneSerializerField
99

@@ -12,8 +12,7 @@
1212
from dcim.models import *
1313
from extras.api.nested_serializers import NestedConfigTemplateSerializer
1414
from ipam.api.nested_serializers import (
15-
NestedASNSerializer, NestedIPAddressSerializer, NestedL2VPNTerminationSerializer, NestedVLANSerializer,
16-
NestedVRFSerializer,
15+
NestedASNSerializer, NestedIPAddressSerializer, NestedVLANSerializer, NestedVRFSerializer,
1716
)
1817
from ipam.models import ASN, VLAN
1918
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
@@ -27,6 +26,7 @@
2726
from users.api.nested_serializers import NestedUserSerializer
2827
from utilities.api import get_serializer_for_model
2928
from virtualization.api.nested_serializers import NestedClusterSerializer
29+
from vpn.api.nested_serializers import NestedL2VPNTerminationSerializer
3030
from wireless.api.nested_serializers import NestedWirelessLANSerializer, NestedWirelessLinkSerializer
3131
from wireless.choices import *
3232
from wireless.models import WirelessLAN

netbox/dcim/filtersets.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from extras.filtersets import LocalConfigContextFilterSet
66
from extras.models import ConfigTemplate
77
from ipam.filtersets import PrimaryIPFilterSet
8-
from ipam.models import ASN, L2VPN, IPAddress, VRF
8+
from ipam.models import ASN, IPAddress, VRF
99
from netbox.filtersets import (
1010
BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet,
1111
)
@@ -17,6 +17,7 @@
1717
TreeNodeMultipleChoiceFilter,
1818
)
1919
from virtualization.models import Cluster
20+
from vpn.models import L2VPN
2021
from wireless.choices import WirelessRoleChoices, WirelessChannelChoices
2122
from .choices import *
2223
from .constants import *

netbox/dcim/forms/filtersets.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
from dcim.models import *
88
from extras.forms import LocalConfigContextFilterForm
99
from extras.models import ConfigTemplate
10-
from ipam.models import ASN, L2VPN, VRF
10+
from ipam.models import ASN, VRF
1111
from netbox.forms import NetBoxModelFilterSetForm
1212
from tenancy.forms import ContactModelFilterForm, TenancyFilterForm
1313
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
1414
from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField
1515
from utilities.forms.widgets import APISelectMultiple, NumberWithOptions
16+
from vpn.models import L2VPN
1617
from wireless.choices import *
1718

1819
__all__ = (

netbox/dcim/models/device_components.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,7 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd
730730
related_query_name='interface'
731731
)
732732
l2vpn_terminations = GenericRelation(
733-
to='ipam.L2VPNTermination',
733+
to='vpn.L2VPNTermination',
734734
content_type_field='assigned_object_type',
735735
object_id_field='assigned_object_id',
736736
related_query_name='interface',

netbox/dcim/tables/template_code.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,8 +316,8 @@
316316
{% if perms.dcim.add_interface %}
317317
<li><a class="dropdown-item" href="{% url 'dcim:interface_add' %}?device={{ record.device_id }}&parent={{ record.pk }}&name={{ record.name }}.&type=virtual&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Child Interface</a></li>
318318
{% endif %}
319-
{% if perms.ipam.add_l2vpntermination %}
320-
<li><a class="dropdown-item" href="{% url 'ipam:l2vpntermination_add' %}?device={{ object.pk }}&interface={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">L2VPN Termination</a></li>
319+
{% if perms.vpn.add_l2vpntermination %}
320+
<li><a class="dropdown-item" href="{% url 'vpn:l2vpntermination_add' %}?device={{ object.pk }}&interface={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">L2VPN Termination</a></li>
321321
{% endif %}
322322
{% if perms.ipam.add_fhrpgroupassignment %}
323323
<li><a class="dropdown-item" href="{% url 'ipam:fhrpgroupassignment_add' %}?interface_type={{ record|content_type_id }}&interface_id={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Assign FHRP Group</a></li>

netbox/ipam/api/nested_serializers.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from rest_framework import serializers
33

44
from ipam import models
5-
from ipam.models.l2vpn import L2VPNTermination, L2VPN
65
from netbox.api.serializers import WritableNestedSerializer
76
from .field_serializers import IPAddressField
87

@@ -14,8 +13,6 @@
1413
'NestedFHRPGroupAssignmentSerializer',
1514
'NestedIPAddressSerializer',
1615
'NestedIPRangeSerializer',
17-
'NestedL2VPNSerializer',
18-
'NestedL2VPNTerminationSerializer',
1916
'NestedPrefixSerializer',
2017
'NestedRIRSerializer',
2118
'NestedRoleSerializer',
@@ -223,28 +220,3 @@ class NestedServiceSerializer(WritableNestedSerializer):
223220
class Meta:
224221
model = models.Service
225222
fields = ['id', 'url', 'display', 'name', 'protocol', 'ports']
226-
227-
#
228-
# L2VPN
229-
#
230-
231-
232-
class NestedL2VPNSerializer(WritableNestedSerializer):
233-
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:l2vpn-detail')
234-
235-
class Meta:
236-
model = L2VPN
237-
fields = [
238-
'id', 'url', 'display', 'identifier', 'name', 'slug', 'type'
239-
]
240-
241-
242-
class NestedL2VPNTerminationSerializer(WritableNestedSerializer):
243-
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:l2vpntermination-detail')
244-
l2vpn = NestedL2VPNSerializer()
245-
246-
class Meta:
247-
model = L2VPNTermination
248-
fields = [
249-
'id', 'url', 'display', 'l2vpn'
250-
]

netbox/ipam/api/serializers.py

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
from tenancy.api.nested_serializers import NestedTenantSerializer
1313
from utilities.api import get_serializer_for_model
1414
from virtualization.api.nested_serializers import NestedVirtualMachineSerializer
15-
from .nested_serializers import *
15+
from vpn.api.nested_serializers import NestedL2VPNTerminationSerializer
1616
from .field_serializers import IPAddressField, IPNetworkField
17+
from .nested_serializers import *
1718

1819

1920
#
@@ -479,54 +480,3 @@ class Meta:
479480
'id', 'url', 'display', 'device', 'virtual_machine', 'name', 'ports', 'protocol', 'ipaddresses',
480481
'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
481482
]
482-
483-
#
484-
# L2VPN
485-
#
486-
487-
488-
class L2VPNSerializer(NetBoxModelSerializer):
489-
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:l2vpn-detail')
490-
type = ChoiceField(choices=L2VPNTypeChoices, required=False)
491-
import_targets = SerializedPKRelatedField(
492-
queryset=RouteTarget.objects.all(),
493-
serializer=NestedRouteTargetSerializer,
494-
required=False,
495-
many=True
496-
)
497-
export_targets = SerializedPKRelatedField(
498-
queryset=RouteTarget.objects.all(),
499-
serializer=NestedRouteTargetSerializer,
500-
required=False,
501-
many=True
502-
)
503-
tenant = NestedTenantSerializer(required=False, allow_null=True)
504-
505-
class Meta:
506-
model = L2VPN
507-
fields = [
508-
'id', 'url', 'display', 'identifier', 'name', 'slug', 'type', 'import_targets', 'export_targets',
509-
'description', 'comments', 'tenant', 'tags', 'custom_fields', 'created', 'last_updated'
510-
]
511-
512-
513-
class L2VPNTerminationSerializer(NetBoxModelSerializer):
514-
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:l2vpntermination-detail')
515-
l2vpn = NestedL2VPNSerializer()
516-
assigned_object_type = ContentTypeField(
517-
queryset=ContentType.objects.all()
518-
)
519-
assigned_object = serializers.SerializerMethodField(read_only=True)
520-
521-
class Meta:
522-
model = L2VPNTermination
523-
fields = [
524-
'id', 'url', 'display', 'l2vpn', 'assigned_object_type', 'assigned_object_id',
525-
'assigned_object', 'tags', 'custom_fields', 'created', 'last_updated'
526-
]
527-
528-
@extend_schema_field(serializers.JSONField(allow_null=True))
529-
def get_assigned_object(self, instance):
530-
serializer = get_serializer_for_model(instance.assigned_object, prefix=NESTED_SERIALIZER_PREFIX)
531-
context = {'request': self.context['request']}
532-
return serializer(instance.assigned_object, context=context).data

netbox/ipam/api/urls.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
router.register('vlans', views.VLANViewSet)
2424
router.register('service-templates', views.ServiceTemplateViewSet)
2525
router.register('services', views.ServiceViewSet)
26-
router.register('l2vpns', views.L2VPNViewSet)
27-
router.register('l2vpn-terminations', views.L2VPNTerminationViewSet)
2826

2927
app_name = 'ipam-api'
3028

netbox/ipam/api/views.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from dcim.models import Site
1515
from ipam import filtersets
1616
from ipam.models import *
17-
from ipam.models import L2VPN, L2VPNTermination
1817
from ipam.utils import get_next_available_prefix
1918
from netbox.api.viewsets import NetBoxModelViewSet
2019
from netbox.api.viewsets.mixins import ObjectValidationMixin
@@ -178,18 +177,6 @@ class ServiceViewSet(NetBoxModelViewSet):
178177
filterset_class = filtersets.ServiceFilterSet
179178

180179

181-
class L2VPNViewSet(NetBoxModelViewSet):
182-
queryset = L2VPN.objects.prefetch_related('import_targets', 'export_targets', 'tenant', 'tags')
183-
serializer_class = serializers.L2VPNSerializer
184-
filterset_class = filtersets.L2VPNFilterSet
185-
186-
187-
class L2VPNTerminationViewSet(NetBoxModelViewSet):
188-
queryset = L2VPNTermination.objects.prefetch_related('assigned_object')
189-
serializer_class = serializers.L2VPNTerminationSerializer
190-
filterset_class = filtersets.L2VPNTerminationFilterSet
191-
192-
193180
#
194181
# Views
195182
#

netbox/ipam/choices.py

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -172,52 +172,3 @@ class ServiceProtocolChoices(ChoiceSet):
172172
(PROTOCOL_UDP, 'UDP'),
173173
(PROTOCOL_SCTP, 'SCTP'),
174174
)
175-
176-
177-
class L2VPNTypeChoices(ChoiceSet):
178-
TYPE_VPLS = 'vpls'
179-
TYPE_VPWS = 'vpws'
180-
TYPE_EPL = 'epl'
181-
TYPE_EVPL = 'evpl'
182-
TYPE_EPLAN = 'ep-lan'
183-
TYPE_EVPLAN = 'evp-lan'
184-
TYPE_EPTREE = 'ep-tree'
185-
TYPE_EVPTREE = 'evp-tree'
186-
TYPE_VXLAN = 'vxlan'
187-
TYPE_VXLAN_EVPN = 'vxlan-evpn'
188-
TYPE_MPLS_EVPN = 'mpls-evpn'
189-
TYPE_PBB_EVPN = 'pbb-evpn'
190-
191-
CHOICES = (
192-
('VPLS', (
193-
(TYPE_VPWS, 'VPWS'),
194-
(TYPE_VPLS, 'VPLS'),
195-
)),
196-
('VXLAN', (
197-
(TYPE_VXLAN, 'VXLAN'),
198-
(TYPE_VXLAN_EVPN, 'VXLAN-EVPN'),
199-
)),
200-
('L2VPN E-VPN', (
201-
(TYPE_MPLS_EVPN, 'MPLS EVPN'),
202-
(TYPE_PBB_EVPN, 'PBB EVPN'),
203-
)),
204-
('E-Line', (
205-
(TYPE_EPL, 'EPL'),
206-
(TYPE_EVPL, 'EVPL'),
207-
)),
208-
('E-LAN', (
209-
(TYPE_EPLAN, 'Ethernet Private LAN'),
210-
(TYPE_EVPLAN, 'Ethernet Virtual Private LAN'),
211-
)),
212-
('E-Tree', (
213-
(TYPE_EPTREE, 'Ethernet Private Tree'),
214-
(TYPE_EVPTREE, 'Ethernet Virtual Private Tree'),
215-
)),
216-
)
217-
218-
P2P = (
219-
TYPE_VPWS,
220-
TYPE_EPL,
221-
TYPE_EPLAN,
222-
TYPE_EPTREE
223-
)

netbox/ipam/constants.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,3 @@
8686
# 16-bit port number
8787
SERVICE_PORT_MIN = 1
8888
SERVICE_PORT_MAX = 65535
89-
90-
L2VPN_ASSIGNMENT_MODELS = Q(
91-
Q(app_label='dcim', model='interface') |
92-
Q(app_label='ipam', model='vlan') |
93-
Q(app_label='virtualization', model='vminterface')
94-
)

0 commit comments

Comments
 (0)