Add IPAM parent property

Closes #10691
This commit is contained in:
Erik Hansson 2022-10-19 11:53:36 +02:00
parent 4cb0230878
commit 54f9a22be4
2 changed files with 47 additions and 0 deletions

View File

@ -461,6 +461,16 @@ class Prefix(GetAvailablePrefixesMixin, NetBoxModel):
f'prefix__{lookup}': self.prefix f'prefix__{lookup}': self.prefix
}) })
@property
def parent_prefix(self):
"""
Return smallest containing Prefix in the hierarchy.
"""
return Prefix.objects.filter(
vrf= self.vrf,
prefix__net_contains= self.prefix
).order_by("-prefix__net_mask_length").first()
def get_children(self, include_self=False): def get_children(self, include_self=False):
""" """
Return all covered Prefixes in the hierarchy. Return all covered Prefixes in the hierarchy.
@ -957,6 +967,25 @@ class IPAddress(NetBoxModel):
return self.address.version return self.address.version
return None return None
@property
def parent_prefix(self):
"""
Return smallest containing Prefix in the hierarchy.
"""
return Prefix.objects.filter(
vrf= self.vrf,
prefix__net_contains= self.address.ip
).order_by("-prefix__net_mask_length").first()
@property
def parent_range(self):
"""
Return the range containing this address, if any.
"""
return IPRange.objects.filter(
start_address__lte=self.address,
end_address__gte=self.address).order_by("size").first()
def _set_mask_length(self, value): def _set_mask_length(self, value):
""" """
Expose the IPNetwork object's prefixlen attribute on the parent model so that it can be manipulated directly, Expose the IPNetwork object's prefixlen attribute on the parent model so that it can be manipulated directly,

View File

@ -117,6 +117,24 @@ class TestPrefix(TestCase):
# VRF container is limited to its own VRF # VRF container is limited to its own VRF
self.assertSetEqual(child_ip_pks, {ips[1].pk}) self.assertSetEqual(child_ip_pks, {ips[1].pk})
def test_get_parent_prefix(self):
prefixes = Prefix.objects.bulk_create((
Prefix(prefix=IPNetwork('10.0.0.0/16'), status=PrefixStatusChoices.STATUS_CONTAINER),
Prefix(prefix=IPNetwork('10.0.0.0/24'), status=PrefixStatusChoices.STATUS_ACTIVE)
))
ips = IPAddress.objects.bulk_create((
IPAddress(address=IPNetwork('10.0.0.1/24')),
IPAddress(address=IPNetwork('10.0.0.2/24')),
))
ranges = IPRange.objects.bulk_create((
IPRange(start_address=IPNetwork('10.0.0.1/24'), end_address=IPNetwork('10.0.0.10/24'), size=10),
IPRange(start_address=IPNetwork('10.0.0.11/24'), end_address=IPNetwork('10.0.0.17/24'), size=7),
IPRange(start_address=IPNetwork('10.0.0.1/24'), end_address=IPNetwork('10.0.0.17/24'), size=17),
))
self.assertEqual(prefixes[1], ips[0].parent_prefix)
self.assertEqual(prefixes[0], prefixes[1].parent_prefix)
self.assertEqual(ranges[0], ips[0].parent_range)
def test_get_available_prefixes(self): def test_get_available_prefixes(self):
prefixes = Prefix.objects.bulk_create(( prefixes = Prefix.objects.bulk_create((