diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e3d1a064..17d588f02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,12 +10,15 @@ v2.5.3 (FUTURE) * [#1870](https://github.com/digitalocean/netbox/issues/1870) - Add per-page toggle to object lists * [#1871](https://github.com/digitalocean/netbox/issues/1871) - Enable filtering sites by parent region * [#1983](https://github.com/digitalocean/netbox/issues/1983) - Enable regular expressions when bulk renaming device components +* [#2682](https://github.com/digitalocean/netbox/issues/2682) - Add DAC and AOC cable types * [#2693](https://github.com/digitalocean/netbox/issues/2693) - Additional cable colors * [#2726](https://github.com/digitalocean/netbox/issues/2726) - Include cables in global search ## Bug Fixes * [#2742](https://github.com/digitalocean/netbox/issues/2742) - Preserve cluster assignment when editing a device +* [#2757](https://github.com/digitalocean/netbox/issues/2757) - Always treat first/last IPs within a /31 or /127 as usable +* [#2762](https://github.com/digitalocean/netbox/issues/2762) - Add missing DCIM field values to API `_choices` endpoint --- diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 1b6e54580..d01358447 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -35,13 +35,18 @@ from .exceptions import MissingFilterException class DCIMFieldChoicesViewSet(FieldChoicesViewSet): fields = ( - (Cable, ['length_unit']), - (Device, ['face', 'status']), + (Cable, ['length_unit', 'status', 'type']), (ConsolePort, ['connection_status']), - (Interface, ['connection_status', 'form_factor', 'mode']), + (Device, ['face', 'status']), + (DeviceType, ['subdevice_role']), + (FrontPort, ['type']), + (FrontPortTemplate, ['type']), + (Interface, ['form_factor', 'mode']), (InterfaceTemplate, ['form_factor']), (PowerPort, ['connection_status']), (Rack, ['outer_unit', 'status', 'type', 'width']), + (RearPort, ['type']), + (RearPortTemplate, ['type']), (Site, ['status']), ) diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index ecb5f7b8d..27f8b6f79 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -339,11 +339,14 @@ CABLE_TYPE_CAT5E = 1510 CABLE_TYPE_CAT6 = 1600 CABLE_TYPE_CAT6A = 1610 CABLE_TYPE_CAT7 = 1700 +CABLE_TYPE_DAC_ACTIVE = 1800 +CABLE_TYPE_DAC_PASSIVE = 1810 CABLE_TYPE_MMF_OM1 = 3010 CABLE_TYPE_MMF_OM2 = 3020 CABLE_TYPE_MMF_OM3 = 3030 CABLE_TYPE_MMF_OM4 = 3040 CABLE_TYPE_SMF = 3500 +CABLE_TYPE_AOC = 3800 CABLE_TYPE_POWER = 5000 CABLE_TYPE_CHOICES = ( ( @@ -354,6 +357,8 @@ CABLE_TYPE_CHOICES = ( (CABLE_TYPE_CAT6, 'CAT6'), (CABLE_TYPE_CAT6A, 'CAT6a'), (CABLE_TYPE_CAT7, 'CAT7'), + (CABLE_TYPE_DAC_ACTIVE, 'Direct Attach Copper (Active)'), + (CABLE_TYPE_DAC_PASSIVE, 'Direct Attach Copper (Passive)'), ), ), ( @@ -363,6 +368,7 @@ CABLE_TYPE_CHOICES = ( (CABLE_TYPE_MMF_OM3, 'Multimode Fiber (OM3)'), (CABLE_TYPE_MMF_OM4, 'Multimode Fiber (OM4)'), (CABLE_TYPE_SMF, 'Singlemode Fiber'), + (CABLE_TYPE_AOC, 'Active Optical Cabling (AOC)'), ), ), (CABLE_TYPE_POWER, 'Power'), diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index 6f7a21236..a14e1c7ed 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -438,12 +438,23 @@ class Prefix(ChangeLoggedModel, CustomFieldModel): child_ips = netaddr.IPSet([ip.address.ip for ip in self.get_child_ips()]) available_ips = prefix - child_ips - # Remove unusable IPs from non-pool prefixes - if not self.is_pool: - available_ips -= netaddr.IPSet([ - netaddr.IPAddress(self.prefix.first), - netaddr.IPAddress(self.prefix.last), - ]) + # All IP addresses within a pool are considered usable + if self.is_pool: + return available_ips + + # All IP addresses within a point-to-point prefix (IPv4 /31 or IPv6 /127) are considered usable + if ( + self.family == 4 and self.prefix.prefixlen == 31 # RFC 3021 + ) or ( + self.family == 6 and self.prefix.prefixlen == 127 # RFC 6164 + ): + return available_ips + + # Omit first and last IP address from the available set + available_ips -= netaddr.IPSet([ + netaddr.IPAddress(self.prefix.first), + netaddr.IPAddress(self.prefix.last), + ]) return available_ips diff --git a/netbox/templates/inc/paginator.html b/netbox/templates/inc/paginator.html index e7be9eddb..ac4648988 100644 --- a/netbox/templates/inc/paginator.html +++ b/netbox/templates/inc/paginator.html @@ -20,6 +20,11 @@
+ {% for k, v in request.GET.items %} + {% if k != 'per_page' %} + + {% endif %} + {% endfor %}