From c265ef7c71144b66a1f10c849b8613c8c69b63d2 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Mon, 16 Sep 2024 13:31:01 -0400 Subject: [PATCH 1/6] Add primary_ip4 and primary_ip6 to bulk import form for VDC --- netbox/dcim/forms/bulk_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 9b4a8475b7e..e1a2d04861e 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -1438,6 +1438,6 @@ class VirtualDeviceContextImportForm(NetBoxModelImportForm): class Meta: fields = [ - 'name', 'device', 'status', 'tenant', 'identifier', 'comments', + 'name', 'device', 'status', 'tenant', 'identifier', 'comments', 'primary_ip4', 'primary_ip6', ] model = VirtualDeviceContext From 972d2ecb21e3e803f65120c35e877b6b86ab1d37 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Mon, 16 Sep 2024 14:48:13 -0400 Subject: [PATCH 2/6] Specify IPAddress querysets with address field accessor and labels --- netbox/dcim/forms/bulk_import.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index e1a2d04861e..a7da35d4629 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -9,7 +9,7 @@ from dcim.constants import * from dcim.models import * from extras.models import ConfigTemplate -from ipam.models import VRF +from ipam.models import VRF, IPAddress from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant from utilities.forms.fields import ( @@ -1435,6 +1435,20 @@ class VirtualDeviceContextImportForm(NetBoxModelImportForm): label=_('Status'), choices=VirtualDeviceContextStatusChoices, ) + primary_ip4 = CSVModelChoiceField( + label=_('Primary IPv4'), + queryset=IPAddress.objects.all(), + required=False, + to_field_name='address', + help_text=_('IPv4 address with mask, e.g. 1.2.3.4/24') + ) + primary_ip6 = CSVModelChoiceField( + label=_('Primary IPv6'), + queryset=IPAddress.objects.all(), + required=False, + to_field_name='address', + help_text=_('IPv6 address') + ) class Meta: fields = [ From eaa27f1c7acb0cf4bda284d93b66e30687ea083e Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Tue, 17 Sep 2024 11:39:37 -0400 Subject: [PATCH 3/6] Filter primary_ip4/ip6 querysets to only those IPs available on the device --- netbox/dcim/forms/bulk_import.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index a7da35d4629..ebf0c1c0591 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -1447,7 +1447,7 @@ class VirtualDeviceContextImportForm(NetBoxModelImportForm): queryset=IPAddress.objects.all(), required=False, to_field_name='address', - help_text=_('IPv6 address') + help_text=_('IPv6 address with mask, e.g. 1111:2222:3333:4444:5555:6666:7777:8888/24') ) class Meta: @@ -1455,3 +1455,13 @@ class Meta: 'name', 'device', 'status', 'tenant', 'identifier', 'comments', 'primary_ip4', 'primary_ip6', ] model = VirtualDeviceContext + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit primary_ip4/ip6 querysets by assigned site + params = {f"interface__device__{self.fields['device'].to_field_name}": data.get('device')} + self.fields['primary_ip4'].queryset = self.fields['primary_ip4'].queryset.filter(**params) + self.fields['primary_ip6'].queryset = self.fields['primary_ip6'].queryset.filter(**params) From d6ebe3bd2d29540d0adc06dddb6fbdfeb3849392 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Tue, 17 Sep 2024 11:41:43 -0400 Subject: [PATCH 4/6] Fix comment --- netbox/dcim/forms/bulk_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index ebf0c1c0591..68972997e97 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -1461,7 +1461,7 @@ def __init__(self, data=None, *args, **kwargs): if data: - # Limit primary_ip4/ip6 querysets by assigned site + # Limit primary_ip4/ip6 querysets by assigned device params = {f"interface__device__{self.fields['device'].to_field_name}": data.get('device')} self.fields['primary_ip4'].queryset = self.fields['primary_ip4'].queryset.filter(**params) self.fields['primary_ip6'].queryset = self.fields['primary_ip6'].queryset.filter(**params) From c739d38f451513f9a4e1567613a022a0b9c250e0 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Tue, 17 Sep 2024 11:45:32 -0400 Subject: [PATCH 5/6] Make ipv6 help text more correct --- netbox/dcim/forms/bulk_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 68972997e97..894f3ed7398 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -1447,7 +1447,7 @@ class VirtualDeviceContextImportForm(NetBoxModelImportForm): queryset=IPAddress.objects.all(), required=False, to_field_name='address', - help_text=_('IPv6 address with mask, e.g. 1111:2222:3333:4444:5555:6666:7777:8888/24') + help_text=_('IPv6 address with prefix length, e.g. 1111:2222:3333:4444:5555:6666:7777:8888/64') ) class Meta: From b9752fb28e03e401057cb81575c271f7ef5a0ff0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 19 Sep 2024 13:49:54 -0400 Subject: [PATCH 6/6] Shorten IPv6 example --- netbox/dcim/forms/bulk_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 894f3ed7398..e9c8b362e52 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -1447,7 +1447,7 @@ class VirtualDeviceContextImportForm(NetBoxModelImportForm): queryset=IPAddress.objects.all(), required=False, to_field_name='address', - help_text=_('IPv6 address with prefix length, e.g. 1111:2222:3333:4444:5555:6666:7777:8888/64') + help_text=_('IPv6 address with prefix length, e.g. 2001:db8::1/64') ) class Meta: