From 67c73768c1820060d37612952700ee5f782d3b51 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 4 Nov 2021 09:58:33 -0400 Subject: [PATCH] Add count_fhrp_groups to interface serializers --- docs/release-notes/version-3.1.md | 9 +++++++-- netbox/dcim/api/serializers.py | 9 ++++++--- netbox/dcim/api/views.py | 2 +- netbox/dcim/models/device_components.py | 4 ++++ netbox/ipam/api/nested_serializers.py | 4 ++++ netbox/virtualization/api/serializers.py | 3 ++- netbox/virtualization/api/views.py | 2 +- 7 files changed, 25 insertions(+), 8 deletions(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 5c039f38b..616313ef2 100644 --- a/docs/release-notes/version-3.1.md +++ b/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 diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 8e74099da..f8e195a98 100644 --- a/netbox/dcim/api/serializers.py +++ b/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): diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index d99e28938..f359f0f24 100644 --- a/netbox/dcim/api/views.py +++ b/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 diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index a957aba41..3896e5e83 100644 --- a/netbox/dcim/models/device_components.py +++ b/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): diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 885982afb..bb0c02a47 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/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 # diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 6cdc0e09a..866b8f9bb 100644 --- a/netbox/virtualization/api/serializers.py +++ b/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): diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 0035a3c13..894045c1a 100644 --- a/netbox/virtualization/api/views.py +++ b/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