|
|
@@ -17,6 +17,7 @@ from dcim.constants import *
|
|
|
from dcim.models import *
|
|
|
from ipam.models import ASN, RIR, VLAN, VRF
|
|
|
from tenancy.models import Tenant
|
|
|
+from utilities.forms.choices import ImportFormatChoices
|
|
|
from utilities.testing import ViewTestCases, create_tags, create_test_device, post_data
|
|
|
from wireless.models import WirelessLAN
|
|
|
|
|
|
@@ -1950,6 +1951,54 @@ class ModuleTestCase(
|
|
|
self.assertHttpStatus(self.client.post(**request), 302)
|
|
|
self.assertEqual(Interface.objects.filter(device=device).count(), 5)
|
|
|
|
|
|
+ @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
|
|
|
+ def test_module_bulk_replication(self):
|
|
|
+ self.add_permissions('dcim.add_module')
|
|
|
+
|
|
|
+ # Add 5 InterfaceTemplates to a ModuleType
|
|
|
+ module_type = ModuleType.objects.first()
|
|
|
+ interface_templates = [
|
|
|
+ InterfaceTemplate(module_type=module_type, name=f'Interface {i}')
|
|
|
+ for i in range(1, 6)
|
|
|
+ ]
|
|
|
+ InterfaceTemplate.objects.bulk_create(interface_templates)
|
|
|
+
|
|
|
+ # Create a module *without* replicating components
|
|
|
+ device = Device.objects.get(name='Device 2')
|
|
|
+ module_bay = ModuleBay.objects.get(device=device, name='Module Bay 4')
|
|
|
+ csv_data = [
|
|
|
+ "device,module_bay,module_type,status,replicate_components",
|
|
|
+ f"{device.name},{module_bay.name},{module_type.model},active,false"
|
|
|
+ ]
|
|
|
+ request = {
|
|
|
+ 'path': self._get_url('import'),
|
|
|
+ 'data': {
|
|
|
+ 'data': '\n'.join(csv_data),
|
|
|
+ 'format': ImportFormatChoices.CSV,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ initial_count = Module.objects.count()
|
|
|
+ self.assertHttpStatus(self.client.post(**request), 200)
|
|
|
+ self.assertEqual(Module.objects.count(), initial_count + len(csv_data) - 1)
|
|
|
+ self.assertEqual(Interface.objects.filter(device=device).count(), 0)
|
|
|
+
|
|
|
+ # Create a second module (in the next bay) with replicated components
|
|
|
+ module_bay = ModuleBay.objects.get(device=device, name='Module Bay 5')
|
|
|
+ csv_data[1] = f"{device.name},{module_bay.name},{module_type.model},active,true"
|
|
|
+ request = {
|
|
|
+ 'path': self._get_url('import'),
|
|
|
+ 'data': {
|
|
|
+ 'data': '\n'.join(csv_data),
|
|
|
+ 'format': ImportFormatChoices.CSV,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ initial_count = Module.objects.count()
|
|
|
+ self.assertHttpStatus(self.client.post(**request), 200)
|
|
|
+ self.assertEqual(Module.objects.count(), initial_count + len(csv_data) - 1)
|
|
|
+ self.assertEqual(Interface.objects.filter(device=device).count(), 5)
|
|
|
+
|
|
|
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
|
|
|
def test_module_component_adoption(self):
|
|
|
self.add_permissions('dcim.add_module')
|
|
|
@@ -1987,6 +2036,50 @@ class ModuleTestCase(
|
|
|
# Check that the Interface now has a module
|
|
|
self.assertIsNotNone(interface.module)
|
|
|
|
|
|
+ @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
|
|
|
+ def test_module_bulk_adoption(self):
|
|
|
+ self.add_permissions('dcim.add_module')
|
|
|
+
|
|
|
+ interface_name = "Interface-1"
|
|
|
+
|
|
|
+ # Add an interface to the ModuleType
|
|
|
+ module_type = ModuleType.objects.first()
|
|
|
+ InterfaceTemplate(module_type=module_type, name=interface_name).save()
|
|
|
+
|
|
|
+ form_data = self.form_data.copy()
|
|
|
+ device = Device.objects.get(pk=form_data['device'])
|
|
|
+
|
|
|
+ # Create an interface to be adopted
|
|
|
+ interface = Interface(device=device, name=interface_name, type=InterfaceTypeChoices.TYPE_10GE_FIXED)
|
|
|
+ interface.save()
|
|
|
+
|
|
|
+ # Ensure that interface is created with no module
|
|
|
+ self.assertIsNone(interface.module)
|
|
|
+
|
|
|
+ # Create a module with adopted components
|
|
|
+ module_bay = ModuleBay.objects.get(device=device, name='Module Bay 4')
|
|
|
+ csv_data = [
|
|
|
+ "device,module_bay,module_type,status,replicate_components,adopt_components",
|
|
|
+ f"{device.name},{module_bay.name},{module_type.model},active,false,true"
|
|
|
+ ]
|
|
|
+ request = {
|
|
|
+ 'path': self._get_url('import'),
|
|
|
+ 'data': {
|
|
|
+ 'data': '\n'.join(csv_data),
|
|
|
+ 'format': ImportFormatChoices.CSV,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ initial_count = self._get_queryset().count()
|
|
|
+ self.assertHttpStatus(self.client.post(**request), 200)
|
|
|
+ self.assertEqual(self._get_queryset().count(), initial_count + len(csv_data) - 1)
|
|
|
+
|
|
|
+ # Re-retrieve interface to get new module id
|
|
|
+ interface.refresh_from_db()
|
|
|
+
|
|
|
+ # Check that the Interface now has a module
|
|
|
+ self.assertIsNotNone(interface.module)
|
|
|
+
|
|
|
|
|
|
class ConsolePortTestCase(ViewTestCases.DeviceComponentViewTestCase):
|
|
|
model = ConsolePort
|