diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 3b7c09ee6..81b75791e 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1036,20 +1036,29 @@ class InterfaceConnectionImportForm(BulkImportForm, BootstrapMixin): return connection_list = [] + occupied_interfaces = [] for i, record in enumerate(records, start=1): form = self.fields['csv'].csv_form(data=record) if form.is_valid(): interface_a = Interface.objects.get(device=form.cleaned_data['device_a'], name=form.cleaned_data['interface_a']) + if interface_a in occupied_interfaces: + raise forms.ValidationError("{} {} found in multiple connections" + .format(interface_a.device.name, interface_a.name)) interface_b = Interface.objects.get(device=form.cleaned_data['device_b'], name=form.cleaned_data['interface_b']) + if interface_b in occupied_interfaces: + raise forms.ValidationError("{} {} found in multiple connections" + .format(interface_b.device.name, interface_b.name)) connection = InterfaceConnection(interface_a=interface_a, interface_b=interface_b) if form.cleaned_data['status'] == 'planned': connection.connection_status = CONNECTION_STATUS_PLANNED else: connection.connection_status = CONNECTION_STATUS_CONNECTED connection_list.append(connection) + occupied_interfaces.append(interface_a) + occupied_interfaces.append(interface_b) else: for field, errors in form.errors.items(): for e in errors: diff --git a/netbox/templates/dcim/interface_connections_import.html b/netbox/templates/dcim/interface_connections_import.html index 79fce2eb2..6329e0680 100644 --- a/netbox/templates/dcim/interface_connections_import.html +++ b/netbox/templates/dcim/interface_connections_import.html @@ -8,6 +8,14 @@