diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 9c00239a5..badef8d30 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -2681,6 +2681,13 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): ) VRF.objects.bulk_create(vrfs) + # Virtual Device Context Creation + vdcs = ( + VirtualDeviceContext(device=devices[3], name='VDC 1', identifier=1, status=VirtualDeviceContextStatusChoices.STATUS_ACTIVE), + VirtualDeviceContext(device=devices[3], name='VDC 2', identifier=2, status=VirtualDeviceContextStatusChoices.STATUS_PLANNED), + ) + VirtualDeviceContext.objects.bulk_create(vdcs) + # VirtualChassis assignment for filtering virtual_chassis = VirtualChassis.objects.create(master=devices[0]) Device.objects.filter(pk=devices[0].pk).update(virtual_chassis=virtual_chassis, vc_position=1, vc_priority=1) @@ -2793,6 +2800,12 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): ) Interface.objects.bulk_create(interfaces) + interfaces[3].vdcs.set([vdcs[0], vdcs[1]]) + interfaces[4].vdcs.set([vdcs[0], vdcs[1]]) + interfaces[5].vdcs.set([vdcs[0]]) + interfaces[6].vdcs.set([vdcs[0]]) + interfaces[7].vdcs.set([vdcs[1]]) + # Cables Cable(a_terminations=[interfaces[0]], b_terminations=[interfaces[3]]).save() Cable(a_terminations=[interfaces[1]], b_terminations=[interfaces[4]]).save() @@ -2997,6 +3010,22 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'vrf': [vrfs[0].rd, vrfs[1].rd]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_vdc(self): + params = {'vdc': ['VDC 1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + devices = Device.objects.last() + vdc = VirtualDeviceContext.objects.filter(device=devices, name='VDC 2') + params = {'vdc_id': vdc.values_list('pk', flat=True)} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_vdc_identifier(self): + devices = Device.objects.last() + vdc = VirtualDeviceContext.objects.filter(device=devices, name='VDC 2') + params = {'vdc_identifier': vdc.values_list('identifier', flat=True)} + print(params) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + class FrontPortTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = FrontPort.objects.all() @@ -4254,7 +4283,9 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) -class VirtualDeviceContextBaseTestCase: +class VirtualDeviceContextTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = VirtualDeviceContext.objects.all() + filterset = VirtualDeviceContextFilterSet @classmethod def setUpTestData(cls): @@ -4266,21 +4297,6 @@ class VirtualDeviceContextBaseTestCase: ) Site.objects.bulk_create(sites) - locations = ( - Location(name='Location 1', site=sites[0], slug='location-1'), - Location(name='Location 2', site=sites[1], slug='location-1'), - Location(name='Location 3', site=sites[2], slug='location-1'), - ) - for location in locations: - location.save() - - racks = ( - Rack(name='Rack 1', site=sites[0], location=locations[0]), - Rack(name='Rack 2', site=sites[1], location=locations[1]), - Rack(name='Rack 3', site=sites[2], location=locations[2]), - ) - Rack.objects.bulk_create(racks) - tenants = ( Tenant(name='Tenant 1', slug='tenant-1'), Tenant(name='Tenant 2', slug='tenant-2'), @@ -4293,9 +4309,9 @@ class VirtualDeviceContextBaseTestCase: device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1') devices = ( - Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], rack=racks[0], location=locations[0], position=1), - Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], rack=racks[1], location=locations[1], position=1), - Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], rack=racks[2], location=locations[2], position=1), + Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]), + Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]), + Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]), ) Device.objects.bulk_create(devices) @@ -4310,38 +4326,24 @@ class VirtualDeviceContextBaseTestCase: VirtualDeviceContext.objects.bulk_create(vdcs) interfaces = ( - Interface(device=devices[0], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[0], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[1], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[1], name='Interface 4', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[2], name='Interface 5', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[2], name='Interface 6', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[0], name='Interface 7', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[0], name='Interface 8', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[1], name='Interface 9', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[1], name='Interface 10', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[2], name='Interface 11', type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(device=devices[2], name='Interface 12', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[0], name='Interface 1', type='virtual'), + Interface(device=devices[0], name='Interface 2', type='virtual'), ) Interface.objects.bulk_create(interfaces) - interfaces[0].vdcs.set([vdcs[0], vdcs[1]]) - interfaces[1].vdcs.set([vdcs[0], vdcs[1]]) - interfaces[2].vdcs.set([vdcs[2], vdcs[3]]) - interfaces[3].vdcs.set([vdcs[2], vdcs[3]]) - interfaces[4].vdcs.set([vdcs[4], vdcs[5]]) - interfaces[5].vdcs.set([vdcs[4], vdcs[5]]) - interfaces[6].vdcs.set([vdcs[0]]) - interfaces[7].vdcs.set([vdcs[1]]) - interfaces[8].vdcs.set([vdcs[2]]) - interfaces[9].vdcs.set([vdcs[3]]) - interfaces[10].vdcs.set([vdcs[4]]) - interfaces[11].vdcs.set([vdcs[5]]) + interfaces[0].vdcs.set([vdcs[0]]) + interfaces[1].vdcs.set([vdcs[1]]) + addresses = ( + IPAddress(assigned_object=interfaces[0], address='10.1.1.1/24'), + IPAddress(assigned_object=interfaces[1], address='10.1.1.2/24'), + ) + IPAddress.objects.bulk_create(addresses) -class VirtualDeviceContextTestCase(VirtualDeviceContextBaseTestCase, TestCase, ChangeLoggedFilterSetTests): - queryset = VirtualDeviceContext.objects.all() - filterset = VirtualDeviceContextFilterSet + vdcs[0].primary_ip4 = addresses[0] + vdcs[0].save() + vdcs[1].primary_ip4 = addresses[1] + vdcs[1].save() def test_device(self): params = {'device': ['Device 1', 'Device 2']} @@ -4351,24 +4353,13 @@ class VirtualDeviceContextTestCase(VirtualDeviceContextBaseTestCase, TestCase, C params = {'status': ['active']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - -class VirtualDeviceContextInterfaceTestCase(VirtualDeviceContextBaseTestCase, TestCase, ChangeLoggedFilterSetTests): - queryset = Interface.objects.all() - filterset = InterfaceFilterSet - - def test_vdc(self): - params = {'vdc': ['VDC 1']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 9) - - devices = Device.objects.first() - vdc = VirtualDeviceContext.objects.filter(device=devices) - params = {'vdc_id': vdc.values_list('pk', flat=True)} + def test_device_id(self): + devices = Device.objects.filter(name__in=['Device 1', 'Device 2']) + params = {'device_id': [devices[0].pk, devices[1].pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) - def test_vdc_identifier(self): - devices = Device.objects.first() - vdc = VirtualDeviceContext.objects.filter(device=devices) - params = {'vdc_identifier': vdc.values_list('identifier', flat=True)} + def test_has_primary_ip(self): + params = {'has_primary_ip': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'has_primary_ip': False} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) - -# TODO: Connection filters diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 3a18b6cc8..a64c6d56b 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -590,7 +590,7 @@ class CableTestCase(TestCase): cable.clean() -class CableTestCase(TestCase): +class VirtualDeviceContextTestCase(TestCase): def setUp(self): @@ -606,12 +606,32 @@ class CableTestCase(TestCase): device_type=devicetype, device_role=devicerole, name='TestDevice1', site=site ) - self.vdc1 = VirtualDeviceContext.objects.create(device=self.device, name="VDC 1", identifier=1) - self.vdc2 = VirtualDeviceContext.objects.create(device=self.device, name="VDC 2", identifier=1) + def test_vdc_and_interface_creation(self): - self.interface1 = Interface.objects.create(device=self.device1, name='Eth1/1', type='10gbase-t') - self.interface2 = Interface.objects.create(device=self.device2, name='Eth1/2', type='10gbase-t') - self.interface3 = Interface.objects.create(device=self.device2, name='Eth1/3', type='10gbase-t') + vdc = VirtualDeviceContext(device=self.device, name="VDC 1", identifier=1, status='active') + vdc.full_clean() + vdc.save() - self.interface2.vdcs.set([self.vdc1]) - self.interface3.vdcs.set([self.vdc2]) + interface = Interface(device=self.device, name='Eth1/1', type='10gbase-t') + interface.full_clean() + interface.save() + + interface.vdcs.set([vdc]) + + def test_vdc_duplicate_name(self): + vdc1 = VirtualDeviceContext(device=self.device, name="VDC 1", identifier=1, status='active') + vdc1.full_clean() + vdc1.save() + + vdc2 = VirtualDeviceContext(device=self.device, name="VDC 1", identifier=2, status='active') + with self.assertRaises(ValidationError): + vdc2.full_clean() + + def test_vdc_duplicate_identifier(self): + vdc1 = VirtualDeviceContext(device=self.device, name="VDC 1", identifier=1, status='active') + vdc1.full_clean() + vdc1.save() + + vdc2 = VirtualDeviceContext(device=self.device, name="VDC 2", identifier=1, status='active') + with self.assertRaises(ValidationError): + vdc2.full_clean() diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 90f4b2582..300228601 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -3077,54 +3077,13 @@ class PowerFeedTestCase(ViewTestCases.PrimaryObjectViewTestCase): response = self.client.get(reverse('dcim:powerfeed_trace', kwargs={'pk': powerfeed.pk})) self.assertHttpStatus(response, 200) -# TODO: VDC Test Cases - class VirtualDeviceContextTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = VirtualDeviceContext @classmethod def setUpTestData(cls): - - sites = ( - Site(name='Site 1', slug='site-1'), - Site(name='Site 2', slug='site-2'), - ) - Site.objects.bulk_create(sites) - - location = Location(site=sites[0], name='Location 1', slug='location-1') - location.save() - - racks = ( - Rack(name='Rack 1', site=sites[0], location=location), - Rack(name='Rack 2', site=sites[1]), - ) - Rack.objects.bulk_create(racks) - - manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') - - devicetypes = ( - DeviceType(model='Device Type 1', slug='device-type-1', manufacturer=manufacturer), - DeviceType(model='Device Type 2', slug='device-type-2', manufacturer=manufacturer), - ) - DeviceType.objects.bulk_create(devicetypes) - - deviceroles = ( - DeviceRole(name='Device Role 1', slug='device-role-1'), - DeviceRole(name='Device Role 2', slug='device-role-2'), - ) - DeviceRole.objects.bulk_create(deviceroles) - - platforms = ( - Platform(name='Platform 1', slug='platform-1'), - Platform(name='Platform 2', slug='platform-2'), - ) - Platform.objects.bulk_create(platforms) - - devices = ( - Device(name='Device 1', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]), - ) - Device.objects.bulk_create(devices) + devices = [create_test_device(name='Device 1')] vdcs = ( VirtualDeviceContext(name='VDC 1', identifier=1, device=devices[0], status='active'),