Просмотр исходного кода

Add count_fhrp_groups to interface serializers

jeremystretch 4 лет назад
Родитель
Сommit
67c73768c1

+ 7 - 2
docs/release-notes/version-3.1.md

@@ -94,6 +94,9 @@ Support for single sign-on (SSO) authentication has been added via the [python-s
 
 * Added the following endpoints for ASNs:
     * `/api/ipam/asn/`
+* Added the following endpoints for FHRP groups:
+    * `/api/ipam/fhrp-groups/`
+    * `/api/ipam/fhrp-group-assignments/`
 * Added the following endpoints for contacts:
     * `/api/tenancy/contact-assignments/`
     * `/api/tenancy/contact-groups/`
@@ -127,6 +130,8 @@ Support for single sign-on (SSO) authentication has been added via the [python-s
 * dcim.DeviceType
     * Added `airflow` field 
 * dcim.Interface
+    * `cable_peer` has been renamed to `link_peer`
+    * `cable_peer_type` has been renamed to `link_peer_type`
     * Added `bridge` field
     * Added `rf_channel` field
     * Added `rf_channel_frequency` field
@@ -135,8 +140,7 @@ Support for single sign-on (SSO) authentication has been added via the [python-s
     * Added `tx_power` field
     * Added `wireless_link` field
     * Added `wwn` field
-    * `cable_peer` has been renamed to `link_peer`
-    * `cable_peer_type` has been renamed to `link_peer_type`
+    * Added `count_fhrp_groups` read-only field
 * dcim.Location
     * Added `tenant` field
 * dcim.Site
@@ -145,3 +149,4 @@ Support for single sign-on (SSO) authentication has been added via the [python-s
     * Added the `conditions` field
 * virtualization.VMInterface
     * Added `bridge` field
+    * Added `count_fhrp_groups` read-only field

+ 6 - 3
netbox/dcim/api/serializers.py

@@ -6,8 +6,10 @@ from timezone_field.rest_framework import TimeZoneSerializerField
 from dcim.choices import *
 from dcim.constants import *
 from dcim.models import *
-from ipam.api.nested_serializers import NestedASNSerializer, NestedIPAddressSerializer, NestedVLANSerializer
-from ipam.models import ASN, VLAN
+from ipam.api.nested_serializers import (
+    NestedASNSerializer, NestedFHRPGroupAssignmentSerializer, NestedIPAddressSerializer, NestedVLANSerializer,
+)
+from ipam.models import ASN, FHRPGroupAssignment, VLAN
 from netbox.api import ChoiceField, ContentTypeField, SerializedPKRelatedField
 from netbox.api.serializers import (
     NestedGroupModelSerializer, PrimaryModelSerializer, ValidatedModelSerializer, WritableNestedSerializer,
@@ -636,6 +638,7 @@ class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con
         many=True
     )
     count_ipaddresses = serializers.IntegerField(read_only=True)
+    count_fhrp_groups = serializers.IntegerField(read_only=True)
 
     class Meta:
         model = Interface
@@ -645,7 +648,7 @@ class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con
             'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'wireless_link',
             'link_peer', 'link_peer_type', 'wireless_lans', 'connected_endpoint', 'connected_endpoint_type',
             'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses',
-            '_occupied',
+            'count_fhrp_groups', '_occupied',
         ]
 
     def validate(self, data):

+ 1 - 1
netbox/dcim/api/views.py

@@ -548,7 +548,7 @@ class PowerOutletViewSet(PathEndpointMixin, ModelViewSet):
 class InterfaceViewSet(PathEndpointMixin, ModelViewSet):
     queryset = Interface.objects.prefetch_related(
         'device', 'parent', 'bridge', 'lag', '_path__destination', 'cable', '_link_peer', 'wireless_lans',
-        'untagged_vlan', 'tagged_vlans', 'ip_addresses', 'tags'
+        'untagged_vlan', 'tagged_vlans', 'ip_addresses', 'fhrp_group_assignments', 'tags'
     )
     serializer_class = serializers.InterfaceSerializer
     filterset_class = filtersets.InterfaceFilterSet

+ 4 - 0
netbox/dcim/models/device_components.py

@@ -498,6 +498,10 @@ class BaseInterface(models.Model):
     def count_ipaddresses(self):
         return self.ip_addresses.count()
 
+    @property
+    def count_fhrp_groups(self):
+        return self.fhrp_group_assignments.count()
+
 
 @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks')
 class Interface(ComponentModel, BaseInterface, LinkTermination, PathEndpoint):

+ 4 - 0
netbox/ipam/api/nested_serializers.py

@@ -91,6 +91,10 @@ class NestedFHRPGroupSerializer(WritableNestedSerializer):
         fields = ['id', 'url', 'display', 'protocol', 'group_id']
 
 
+class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail')
+
+
 #
 # VLANs
 #

+ 2 - 1
netbox/virtualization/api/serializers.py

@@ -117,13 +117,14 @@ class VMInterfaceSerializer(PrimaryModelSerializer):
         many=True
     )
     count_ipaddresses = serializers.IntegerField(read_only=True)
+    count_fhrp_groups = serializers.IntegerField(read_only=True)
 
     class Meta:
         model = VMInterface
         fields = [
             'id', 'url', 'display', 'virtual_machine', 'name', 'enabled', 'parent', 'bridge', 'mtu', 'mac_address',
             'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags', 'custom_fields', 'created', 'last_updated',
-            'count_ipaddresses',
+            'count_ipaddresses', 'count_fhrp_groups',
         ]
 
     def validate(self, data):

+ 1 - 1
netbox/virtualization/api/views.py

@@ -80,7 +80,7 @@ class VirtualMachineViewSet(ConfigContextQuerySetMixin, CustomFieldModelViewSet)
 
 class VMInterfaceViewSet(ModelViewSet):
     queryset = VMInterface.objects.prefetch_related(
-        'virtual_machine', 'parent', 'tags', 'untagged_vlan', 'tagged_vlans', 'ip_addresses'
+        'virtual_machine', 'parent', 'tags', 'untagged_vlan', 'tagged_vlans', 'ip_addresses', 'fhrp_group_assignments',
     )
     serializer_class = serializers.VMInterfaceSerializer
     filterset_class = filtersets.VMInterfaceFilterSet