From 6897c5fadde6a9edd20b1d7e7bf38f0f5a474828 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 6 Oct 2021 09:11:42 -0400 Subject: [PATCH] Fixes #7455: Fix site/provider network validation for circuit termination API serializer --- docs/release-notes/version-3.0.md | 1 + netbox/circuits/api/serializers.py | 10 +++++----- netbox/circuits/tests/test_api.py | 22 ++++++++++++++-------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/docs/release-notes/version-3.0.md b/docs/release-notes/version-3.0.md index d2739251e..aa190cc30 100644 --- a/docs/release-notes/version-3.0.md +++ b/docs/release-notes/version-3.0.md @@ -6,6 +6,7 @@ * [#7442](https://github.com/netbox-community/netbox/issues/7442) - Fix missing actions column on user-configured tables * [#7446](https://github.com/netbox-community/netbox/issues/7446) - Fix exception when viewing a large number of child IPs within a prefix +* [#7455](https://github.com/netbox-community/netbox/issues/7455) - Fix site/provider network validation for circuit termination API serializer --- diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index 014ec0fc8..ac6285610 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -3,10 +3,10 @@ from rest_framework import serializers from circuits.choices import CircuitStatusChoices from circuits.models import * from dcim.api.nested_serializers import NestedCableSerializer, NestedSiteSerializer -from dcim.api.serializers import CableTerminationSerializer, ConnectedEndpointSerializer +from dcim.api.serializers import CableTerminationSerializer from netbox.api import ChoiceField from netbox.api.serializers import ( - BaseModelSerializer, OrganizationalModelSerializer, PrimaryModelSerializer, WritableNestedSerializer + OrganizationalModelSerializer, PrimaryModelSerializer, ValidatedModelSerializer, WritableNestedSerializer ) from tenancy.api.nested_serializers import NestedTenantSerializer from .nested_serializers import * @@ -90,11 +90,11 @@ class CircuitSerializer(PrimaryModelSerializer): ] -class CircuitTerminationSerializer(BaseModelSerializer, CableTerminationSerializer): +class CircuitTerminationSerializer(ValidatedModelSerializer, CableTerminationSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') circuit = NestedCircuitSerializer() - site = NestedSiteSerializer(required=False) - provider_network = NestedProviderNetworkSerializer(required=False) + site = NestedSiteSerializer(required=False, allow_null=True) + provider_network = NestedProviderNetworkSerializer(required=False, allow_null=True) cable = NestedCableSerializer(read_only=True) class Meta: diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 424b13d40..830c7d9ca 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -136,14 +136,20 @@ class CircuitTerminationTest(APIViewTestCases.APIViewTestCase): SIDE_A = CircuitTerminationSideChoices.SIDE_A SIDE_Z = CircuitTerminationSideChoices.SIDE_Z + provider = Provider.objects.create(name='Provider 1', slug='provider-1') + circuit_type = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') + sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2'), ) Site.objects.bulk_create(sites) - provider = Provider.objects.create(name='Provider 1', slug='provider-1') - circuit_type = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') + provider_networks = ( + ProviderNetwork(provider=provider, name='Provider Network 1'), + ProviderNetwork(provider=provider, name='Provider Network 2'), + ) + ProviderNetwork.objects.bulk_create(provider_networks) circuits = ( Circuit(cid='Circuit 1', provider=provider, type=circuit_type), @@ -153,10 +159,10 @@ class CircuitTerminationTest(APIViewTestCases.APIViewTestCase): Circuit.objects.bulk_create(circuits) circuit_terminations = ( - CircuitTermination(circuit=circuits[0], site=sites[0], term_side=SIDE_A), - CircuitTermination(circuit=circuits[0], site=sites[1], term_side=SIDE_Z), - CircuitTermination(circuit=circuits[1], site=sites[0], term_side=SIDE_A), - CircuitTermination(circuit=circuits[1], site=sites[1], term_side=SIDE_Z), + CircuitTermination(circuit=circuits[0], term_side=SIDE_A, site=sites[0]), + CircuitTermination(circuit=circuits[0], term_side=SIDE_Z, provider_network=provider_networks[0]), + CircuitTermination(circuit=circuits[1], term_side=SIDE_A, site=sites[1]), + CircuitTermination(circuit=circuits[1], term_side=SIDE_Z, provider_network=provider_networks[1]), ) CircuitTermination.objects.bulk_create(circuit_terminations) @@ -164,13 +170,13 @@ class CircuitTerminationTest(APIViewTestCases.APIViewTestCase): { 'circuit': circuits[2].pk, 'term_side': SIDE_A, - 'site': sites[1].pk, + 'site': sites[0].pk, 'port_speed': 200000, }, { 'circuit': circuits[2].pk, 'term_side': SIDE_Z, - 'site': sites[1].pk, + 'provider_network': provider_networks[0].pk, 'port_speed': 200000, }, ]