@@ -1065,11 +1065,32 @@ def test_import_interfacebridge(self):
1065
1065
slug: test-4000
1066
1066
u_height: 1
1067
1067
interfaces:
1068
- - name: Bridge
1068
+ - name: Standalone 1
1069
+ type: 1000base-t
1070
+ - name: Bridge Interface 2
1069
1071
type: 1000base-t
1072
+ bridge: Bridge
1070
1073
- name: Bridge Interface 1
1071
1074
type: 1000base-t
1072
1075
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
1073
1094
"""
1074
1095
1075
1096
# Add all required permissions to the test user
@@ -1098,13 +1119,73 @@ def test_import_interfacebridge(self):
1098
1119
self .assertContains (response , "Imported 1 device types" )
1099
1120
1100
1121
device_type = DeviceType .objects .get (model = 'TEST-4000' )
1101
- self .assertEqual (device_type .interfacetemplates .count (), 2 )
1122
+ self .assertEqual (device_type .interfacetemplates .count (), 10 )
1102
1123
1103
1124
interfaces = InterfaceTemplate .objects .all ().order_by ('id' )
1104
- self .assertEqual (interfaces [0 ].name , 'Bridge ' )
1125
+ self .assertEqual (interfaces [0 ].name , 'Standalone 1 ' )
1105
1126
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]" )
1108
1189
1109
1190
def test_export_objects (self ):
1110
1191
url = reverse ('dcim:devicetype_list' )
0 commit comments