1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Add VMInterface CSV import view

This commit is contained in:
Jeremy Stretch
2020-06-23 17:01:57 -04:00
parent fce19a363d
commit 603c804535
7 changed files with 45 additions and 21 deletions

View File

@ -2963,12 +2963,6 @@ class InterfaceBulkDisconnectForm(ConfirmationForm):
class InterfaceCSVForm(CSVModelForm):
device = CSVModelChoiceField(
queryset=Device.objects.all(),
required=False,
to_field_name='name'
)
virtual_machine = CSVModelChoiceField(
queryset=VirtualMachine.objects.all(),
required=False,
to_field_name='name'
)
lag = CSVModelChoiceField(

View File

@ -598,17 +598,11 @@ class InterfaceImportTable(BaseTable):
viewname='dcim:device',
args=[Accessor('device.pk')]
)
virtual_machine = tables.LinkColumn(
viewname='virtualization:virtualmachine',
args=[Accessor('virtual_machine.pk')],
verbose_name='Virtual Machine'
)
class Meta(BaseTable.Meta):
model = Interface
fields = (
'device', 'virtual_machine', 'name', 'description', 'lag', 'type', 'enabled', 'mac_address', 'mtu',
'mgmt_only', 'mode',
'device', 'name', 'description', 'lag', 'type', 'enabled', 'mac_address', 'mtu', 'mgmt_only', 'mode',
)
empty_text = False

View File

@ -373,6 +373,11 @@
<a href="{% url 'virtualization:virtualmachine_list' %}">Virtual Machines</a>
</li>
<li{% if not perms.virtualization.view_vminterface%} class="disabled"{% endif %}>
{% if perms.virtualization.add_vminterface %}
<div class="buttons pull-right">
<a href="{% url 'virtualization:vminterface_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
</div>
{% endif %}
<a href="{% url 'virtualization:vminterface_list' %}">Interfaces</a>
</li>
<li class="divider"></li>

View File

@ -715,6 +715,29 @@ class VMInterfaceCreateForm(BootstrapMixin, forms.Form):
self.fields['tagged_vlans'].widget.add_additional_query_param('site_id', site.pk)
class VMInterfaceCSVForm(CSVModelForm):
virtual_machine = CSVModelChoiceField(
queryset=VirtualMachine.objects.all(),
to_field_name='name'
)
mode = CSVChoiceField(
choices=InterfaceModeChoices,
required=False,
help_text='IEEE 802.1Q operational mode (for L2 interfaces)'
)
class Meta:
model = VMInterface
fields = VMInterface.csv_headers
def clean_enabled(self):
# Make sure enabled is True when it's not included in the uploaded data
if 'enabled' not in self.data:
return True
else:
return self.cleaned_data['enabled']
class VMInterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
pk = forms.ModelMultipleChoiceField(
queryset=VMInterface.objects.all(),

View File

@ -189,16 +189,9 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
}
# TODO: Update base class to DeviceComponentViewTestCase
# Blocked by #4721
class VMInterfaceTestCase(
ViewTestCases.ListObjectsViewTestCase,
ViewTestCases.GetObjectViewTestCase,
ViewTestCases.EditObjectViewTestCase,
ViewTestCases.DeleteObjectViewTestCase,
ViewTestCases.BulkCreateObjectsViewTestCase,
ViewTestCases.BulkEditObjectsViewTestCase,
ViewTestCases.BulkDeleteObjectsViewTestCase,
ViewTestCases.DeviceComponentViewTestCase,
):
model = VMInterface
@ -257,6 +250,13 @@ class VMInterfaceTestCase(
'tags': [t.pk for t in tags],
}
cls.csv_data = (
"virtual_machine,name",
"Virtual Machine 2,Interface 4",
"Virtual Machine 2,Interface 5",
"Virtual Machine 2,Interface 6",
)
cls.bulk_edit_data = {
'virtual_machine': virtualmachines[1].pk,
'enabled': False,

View File

@ -53,6 +53,7 @@ urlpatterns = [
# VM interfaces
path('interfaces/', views.InterfaceListView.as_view(), name='vminterface_list'),
path('interfaces/add/', views.InterfaceCreateView.as_view(), name='vminterface_add'),
path('interfaces/import/', views.InterfaceBulkImportView.as_view(), name='vminterface_import'),
path('interfaces/edit/', views.InterfaceBulkEditView.as_view(), name='vminterface_bulk_edit'),
path('interfaces/delete/', views.InterfaceBulkDeleteView.as_view(), name='vminterface_bulk_delete'),
path('interfaces/<int:pk>/', views.InterfaceView.as_view(), name='vminterface'),

View File

@ -349,6 +349,13 @@ class InterfaceDeleteView(ObjectDeleteView):
queryset = VMInterface.objects.all()
class InterfaceBulkImportView(BulkImportView):
queryset = VMInterface.objects.all()
model_form = forms.VMInterfaceCSVForm
table = tables.VMInterfaceTable
default_return_url = 'virtualization:vminterface_list'
class InterfaceBulkEditView(BulkEditView):
queryset = VMInterface.objects.all()
table = tables.VMInterfaceTable