@@ -1065,11 +1065,32 @@ def test_import_interfacebridge(self):
10651065slug: test-4000
10661066u_height: 1
10671067interfaces:
1068- - name: Bridge
1068+ - name: Standalone 1
1069+ type: 1000base-t
1070+ - name: Bridge Interface 2
10691071 type: 1000base-t
1072+ bridge: Bridge
10701073 - name: Bridge Interface 1
10711074 type: 1000base-t
10721075 bridge: Bridge
1076+ - name: Standalone 2
1077+ type: 1000base-t
1078+ - name: Sub-Bridge Interface 2
1079+ type: 1000base-t
1080+ bridge: Sub-Bridge
1081+ - name: Bridge
1082+ type: 1000base-t
1083+ - name: Sub-Bridge
1084+ type: 1000base-t
1085+ bridge: Bridge
1086+ - name: Bridge Interface 3
1087+ type: 1000base-t
1088+ bridge: Bridge
1089+ - name: Sub-Bridge Interface 1
1090+ type: 1000base-t
1091+ bridge: Sub-Bridge
1092+ - name: Standalone 3
1093+ type: 1000base-t
10731094"""
10741095
10751096 # Add all required permissions to the test user
@@ -1098,13 +1119,73 @@ def test_import_interfacebridge(self):
10981119 self .assertContains (response , "Imported 1 device types" )
10991120
11001121 device_type = DeviceType .objects .get (model = 'TEST-4000' )
1101- self .assertEqual (device_type .interfacetemplates .count (), 2 )
1122+ self .assertEqual (device_type .interfacetemplates .count (), 10 )
11021123
11031124 interfaces = InterfaceTemplate .objects .all ().order_by ('id' )
1104- self .assertEqual (interfaces [0 ].name , 'Bridge ' )
1125+ self .assertEqual (interfaces [0 ].name , 'Standalone 1 ' )
11051126 self .assertIsNone (interfaces [0 ].bridge )
1106- self .assertEqual (interfaces [1 ].name , 'Bridge Interface 1' )
1107- self .assertEqual (interfaces [1 ].bridge .name , "Bridge" )
1127+ self .assertEqual (interfaces [1 ].name , 'Standalone 2' )
1128+ self .assertIsNone (interfaces [1 ].bridge )
1129+ self .assertEqual (interfaces [2 ].name , 'Bridge' )
1130+ self .assertIsNone (interfaces [2 ].bridge )
1131+ self .assertEqual (interfaces [3 ].name , 'Standalone 3' )
1132+ self .assertIsNone (interfaces [3 ].bridge )
1133+ self .assertEqual (interfaces [4 ].name , 'Bridge Interface 2' )
1134+ self .assertEqual (interfaces [4 ].bridge .name , "Bridge" )
1135+ self .assertEqual (interfaces [5 ].name , 'Bridge Interface 1' )
1136+ self .assertEqual (interfaces [5 ].bridge .name , "Bridge" )
1137+ self .assertEqual (interfaces [6 ].name , 'Sub-Bridge' )
1138+ self .assertEqual (interfaces [6 ].bridge .name , "Bridge" )
1139+ self .assertEqual (interfaces [7 ].name , 'Bridge Interface 3' )
1140+ self .assertEqual (interfaces [7 ].bridge .name , "Bridge" )
1141+ self .assertEqual (interfaces [8 ].name , 'Sub-Bridge Interface 2' )
1142+ self .assertEqual (interfaces [8 ].bridge .name , "Sub-Bridge" )
1143+ self .assertEqual (interfaces [9 ].name , 'Sub-Bridge Interface 1' )
1144+ self .assertEqual (interfaces [9 ].bridge .name , "Sub-Bridge" )
1145+
1146+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
1147+ def test_import_interfacebridge_cycle (self ):
1148+ IMPORT_DATA = """
1149+ manufacturer: Manufacturer 1
1150+ model: TEST-5000
1151+ slug: test-5000
1152+ u_height: 1
1153+ interfaces:
1154+ - name: Interface 1
1155+ type: 1000base-t
1156+ bridge: Interface 2
1157+ - name: Interface 2
1158+ type: 1000base-t
1159+ bridge: Interface 3
1160+ - name: Interface 3
1161+ type: 1000base-t
1162+ bridge: Interface 1
1163+ """
1164+
1165+ # Add all required permissions to the test user
1166+ self .add_permissions (
1167+ 'dcim.view_devicetype' ,
1168+ 'dcim.add_devicetype' ,
1169+ 'dcim.add_consoleporttemplate' ,
1170+ 'dcim.add_consoleserverporttemplate' ,
1171+ 'dcim.add_powerporttemplate' ,
1172+ 'dcim.add_poweroutlettemplate' ,
1173+ 'dcim.add_interfacetemplate' ,
1174+ 'dcim.add_frontporttemplate' ,
1175+ 'dcim.add_rearporttemplate' ,
1176+ 'dcim.add_modulebaytemplate' ,
1177+ 'dcim.add_devicebaytemplate' ,
1178+ 'dcim.add_inventoryitemtemplate' ,
1179+ )
1180+
1181+ form_data = {
1182+ 'data' : IMPORT_DATA ,
1183+ 'format' : 'yaml'
1184+ }
1185+
1186+ response = self .client .post (reverse ('dcim:devicetype_bulk_import' ), data = form_data , follow = True )
1187+ self .assertHttpStatus (response , 200 )
1188+ self .assertContains (response , "interfaces: Dependency cycle detected in subset [Interface 1, Interface 2, Interface 3]" )
11081189
11091190 def test_export_objects (self ):
11101191 url = reverse ('dcim:devicetype_list' )
0 commit comments