@@ -1063,11 +1063,32 @@ def test_import_interfacebridge(self):
10631063slug: test-4000
10641064u_height: 1
10651065interfaces:
1066- - name: Bridge
1066+ - name: Standalone 1
1067+ type: 1000base-t
1068+ - name: Bridge Interface 2
10671069 type: 1000base-t
1070+ bridge: Bridge
10681071 - name: Bridge Interface 1
10691072 type: 1000base-t
10701073 bridge: Bridge
1074+ - name: Standalone 2
1075+ type: 1000base-t
1076+ - name: Sub-Bridge Interface 2
1077+ type: 1000base-t
1078+ bridge: Sub-Bridge
1079+ - name: Bridge
1080+ type: 1000base-t
1081+ - name: Sub-Bridge
1082+ type: 1000base-t
1083+ bridge: Bridge
1084+ - name: Bridge Interface 3
1085+ type: 1000base-t
1086+ bridge: Bridge
1087+ - name: Sub-Bridge Interface 1
1088+ type: 1000base-t
1089+ bridge: Sub-Bridge
1090+ - name: Standalone 3
1091+ type: 1000base-t
10711092"""
10721093
10731094 # Add all required permissions to the test user
@@ -1096,13 +1117,74 @@ def test_import_interfacebridge(self):
10961117 self .assertContains (response , "Imported 1 device types" )
10971118
10981119 device_type = DeviceType .objects .get (model = 'TEST-4000' )
1099- self .assertEqual (device_type .interfacetemplates .count (), 2 )
1120+ self .assertEqual (device_type .interfacetemplates .count (), 10 )
11001121
11011122 interfaces = InterfaceTemplate .objects .all ().order_by ('id' )
1102- self .assertEqual (interfaces [0 ].name , 'Bridge ' )
1123+ self .assertEqual (interfaces [0 ].name , 'Standalone 1 ' )
11031124 self .assertIsNone (interfaces [0 ].bridge )
1104- self .assertEqual (interfaces [1 ].name , 'Bridge Interface 1' )
1105- self .assertEqual (interfaces [1 ].bridge .name , "Bridge" )
1125+ self .assertEqual (interfaces [1 ].name , 'Standalone 2' )
1126+ self .assertIsNone (interfaces [1 ].bridge )
1127+ self .assertEqual (interfaces [2 ].name , 'Bridge' )
1128+ self .assertIsNone (interfaces [2 ].bridge )
1129+ self .assertEqual (interfaces [3 ].name , 'Standalone 3' )
1130+ self .assertIsNone (interfaces [3 ].bridge )
1131+ self .assertEqual (interfaces [4 ].name , 'Bridge Interface 2' )
1132+ self .assertEqual (interfaces [4 ].bridge .name , "Bridge" )
1133+ self .assertEqual (interfaces [5 ].name , 'Bridge Interface 1' )
1134+ self .assertEqual (interfaces [5 ].bridge .name , "Bridge" )
1135+ self .assertEqual (interfaces [6 ].name , 'Sub-Bridge' )
1136+ self .assertEqual (interfaces [6 ].bridge .name , "Bridge" )
1137+ self .assertEqual (interfaces [7 ].name , 'Bridge Interface 3' )
1138+ self .assertEqual (interfaces [7 ].bridge .name , "Bridge" )
1139+ self .assertEqual (interfaces [8 ].name , 'Sub-Bridge Interface 2' )
1140+ self .assertEqual (interfaces [8 ].bridge .name , "Sub-Bridge" )
1141+ self .assertEqual (interfaces [9 ].name , 'Sub-Bridge Interface 1' )
1142+ self .assertEqual (interfaces [9 ].bridge .name , "Sub-Bridge" )
1143+
1144+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
1145+ def test_import_interfacebridge_cycle (self ):
1146+ IMPORT_DATA = """
1147+ manufacturer: Manufacturer 1
1148+ model: TEST-5000
1149+ slug: test-5000
1150+ u_height: 1
1151+ interfaces:
1152+ - name: Interface 1
1153+ type: 1000base-t
1154+ bridge: Interface 2
1155+ - name: Interface 2
1156+ type: 1000base-t
1157+ bridge: Interface 3
1158+ - name: Interface 3
1159+ type: 1000base-t
1160+ bridge: Interface 1
1161+ """
1162+
1163+ # Add all required permissions to the test user
1164+ self .add_permissions (
1165+ 'dcim.view_devicetype' ,
1166+ 'dcim.add_devicetype' ,
1167+ 'dcim.add_consoleporttemplate' ,
1168+ 'dcim.add_consoleserverporttemplate' ,
1169+ 'dcim.add_powerporttemplate' ,
1170+ 'dcim.add_poweroutlettemplate' ,
1171+ 'dcim.add_interfacetemplate' ,
1172+ 'dcim.add_frontporttemplate' ,
1173+ 'dcim.add_rearporttemplate' ,
1174+ 'dcim.add_modulebaytemplate' ,
1175+ 'dcim.add_devicebaytemplate' ,
1176+ 'dcim.add_inventoryitemtemplate' ,
1177+ )
1178+
1179+ form_data = {
1180+ 'data' : IMPORT_DATA ,
1181+ 'format' : 'yaml'
1182+ }
1183+
1184+ response = self .client .post (reverse ('dcim:devicetype_bulk_import' ), data = form_data , follow = True )
1185+ self .assertHttpStatus (response , 200 )
1186+ self .assertContains (response , "interfaces: Dependency cycle detected in subset "
1187+ "[Interface 1, Interface 2, Interface 3]" )
11061188
11071189 def test_export_objects (self ):
11081190 url = reverse ('dcim:devicetype_list' )
0 commit comments