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

Fixes #1469: Allow a NAT IP to be assigned as the primary IP for a device

This commit is contained in:
Jeremy Stretch
2017-09-01 13:00:44 -04:00
parent 372e9335b1
commit 6b53d263fe
2 changed files with 36 additions and 9 deletions

View File

@ -642,13 +642,28 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldForm):
# Compile list of choices for primary IPv4 and IPv6 addresses # Compile list of choices for primary IPv4 and IPv6 addresses
for family in [4, 6]: for family in [4, 6]:
ip_choices = [] ip_choices = [(None, '---------')]
interface_ips = IPAddress.objects.filter(family=family, interface__device=self.instance) # Collect interface IPs
ip_choices += [(ip.id, '{} ({})'.format(ip.address, ip.interface)) for ip in interface_ips] interface_ips = IPAddress.objects.select_related('interface').filter(
nat_ips = IPAddress.objects.filter(family=family, nat_inside__interface__device=self.instance)\ family=family, interface__device=self.instance
.select_related('nat_inside__interface') )
ip_choices += [(ip.id, '{} ({} NAT)'.format(ip.address, ip.nat_inside.interface)) for ip in nat_ips] if interface_ips:
self.fields['primary_ip{}'.format(family)].choices = [(None, '---------')] + ip_choices ip_choices.append(
('Interface IPs', [
(ip.id, '{} ({})'.format(ip.address, ip.interface)) for ip in interface_ips
])
)
# Collect NAT IPs
nat_ips = IPAddress.objects.select_related('nat_inside').filter(
family=family, nat_inside__interface__device=self.instance
)
if nat_ips:
ip_choices.append(
('NAT IPs', [
(ip.id, '{} ({})'.format(ip.address, ip.nat_inside.address)) for ip in nat_ips
])
)
self.fields['primary_ip{}'.format(family)].choices = ip_choices
# If editing an existing device, exclude it from the list of occupied rack units. This ensures that a device # If editing an existing device, exclude it from the list of occupied rack units. This ensures that a device
# can be flipped from one face to another. # can be flipped from one face to another.

View File

@ -891,13 +891,25 @@ class Device(CreatedUpdatedModel, CustomFieldModel):
pass pass
# Validate primary IPv4 address # Validate primary IPv4 address
if self.primary_ip4 and (self.primary_ip4.interface is None or self.primary_ip4.interface.device != self): if self.primary_ip4 and (
self.primary_ip4.interface is None or
self.primary_ip4.interface.device != self
) and (
self.primary_ip4.nat_inside.interface is None or
self.primary_ip4.nat_inside.interface.device != self
):
raise ValidationError({ raise ValidationError({
'primary_ip4': "The specified IP address ({}) is not assigned to this device.".format(self.primary_ip4), 'primary_ip4': "The specified IP address ({}) is not assigned to this device.".format(self.primary_ip4),
}) })
# Validate primary IPv6 address # Validate primary IPv6 address
if self.primary_ip6 and (self.primary_ip6.interface is None or self.primary_ip6.interface.device != self): if self.primary_ip6 and (
self.primary_ip6.interface is None or
self.primary_ip6.interface.device != self
) and (
self.primary_ip6.nat_inside.interface is None or
self.primary_ip6.nat_inside.interface.device != self
):
raise ValidationError({ raise ValidationError({
'primary_ip6': "The specified IP address ({}) is not assigned to this device.".format(self.primary_ip6), 'primary_ip6': "The specified IP address ({}) is not assigned to this device.".format(self.primary_ip6),
}) })