Forráskód Böngészése

Work on 11507
* Add `rir` property method to model
* Add `aggregate` property method to model
* Add `rir` attribute to serializer
* Add `aggregate` attribute to serializer
* Add test for both rir and aggregate fields on API

Daniel Sheppard 11 hónapja
szülő
commit
1777d4228e

+ 5 - 3
netbox/ipam/api/serializers_/ip.py

@@ -44,6 +44,8 @@ class AggregateSerializer(NetBoxModelSerializer):
 
 
 class PrefixSerializer(NetBoxModelSerializer):
+    aggregate = AggregateSerializer(nested=True, read_only=True, allow_null=True)
+    rir = RIRSerializer(nested=True, read_only=True, allow_null=True)
     family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True)
     vrf = VRFSerializer(nested=True, required=False, allow_null=True)
     scope_type = ContentTypeField(
@@ -67,9 +69,9 @@ class PrefixSerializer(NetBoxModelSerializer):
     class Meta:
         model = Prefix
         fields = [
-            'id', 'url', 'display_url', 'display', 'family', 'prefix', 'vrf', 'scope_type', 'scope_id', 'scope',
-            'tenant', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', 'description', 'comments', 'tags',
-            'custom_fields', 'created', 'last_updated', 'children', '_depth',
+            'id', 'url', 'display_url', 'display', 'aggregate', 'rir', 'family', 'prefix', 'vrf', 'scope_type',
+            'scope_id', 'scope', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', 'description',
+            'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'children', '_depth',
         ]
         brief_fields = ('id', 'url', 'display', 'family', 'prefix', 'description', '_depth')
 

+ 9 - 0
netbox/ipam/models/ip.py

@@ -322,6 +322,15 @@ class Prefix(ContactsMixin, GetAvailablePrefixesMixin, CachedScopeMixin, Primary
 
         super().save(*args, **kwargs)
 
+    @property
+    def aggregate(self):
+        return Aggregate.objects.filter(prefix__net_contains_or_equals=self.prefix).first()
+
+    @property
+    def rir(self):
+        aggregate = self.aggregate
+        return aggregate.rir if aggregate else None
+
     @property
     def family(self):
         return self.prefix.version if self.prefix else None

+ 27 - 0
netbox/ipam/tests/test_api.py

@@ -532,6 +532,33 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(len(response.data), 8)
 
+    def test_get_prefix_with_aggregate_and_rir(self):
+        self.add_permissions('ipam.view_prefix')
+        rir = RIR.objects.create(name='RFC 1918', slug='rfc-1918')
+        aggregate = Aggregate.objects.create(prefix=IPNetwork('192.168.0.0/16'), rir=rir)
+        prefixes = [
+            Prefix.objects.filter(prefix=IPNetwork('192.168.2.0/24')).first(),
+            Prefix.objects.create(prefix=IPNetwork('10.0.0.0/24'))
+        ]
+
+        self.assertIsNotNone(prefixes[0])
+
+        url = self._get_detail_url(prefixes[0])
+        response = self.client.get(url, **self.header)
+        self.assertIsNotNone(prefixes[0].aggregate)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
+        self.assertIsNotNone(response.data.get('aggregate'))
+        self.assertIsNotNone(response.data.get('rir'))
+        self.assertEqual(response.data.get('aggregate').get('id', None), aggregate.pk)
+        self.assertEqual(response.data.get('rir').get('id', None), rir.pk)
+
+        url = self._get_detail_url(prefixes[1])
+        response = self.client.get(url, **self.header)
+        self.assertIsNone(prefixes[1].aggregate)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
+        self.assertIsNone(response.data.get('aggregate'))
+        self.assertIsNone(response.data.get('rir'))
+
 
 class IPRangeTest(APIViewTestCases.APIViewTestCase):
     model = IPRange