From ba3ae0d80adcfad130e62799a770b61e5420d92f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 23 Jul 2018 14:52:51 -0400 Subject: [PATCH] Fixes #2257: Corrected casting of RIR utilization stats as floats --- netbox/ipam/tables.py | 40 +++++++++++++++++++++++++++++----------- netbox/ipam/views.py | 36 ++++++++++++++---------------------- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index 08035d549..382eeae20 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -194,17 +194,35 @@ class RIRTable(BaseTable): class RIRDetailTable(RIRTable): - stats_total = tables.Column(accessor='stats.total', verbose_name='Total', - footer=lambda table: sum(r.stats['total'] for r in table.data)) - stats_active = tables.Column(accessor='stats.active', verbose_name='Active', - footer=lambda table: sum(r.stats['active'] for r in table.data)) - stats_reserved = tables.Column(accessor='stats.reserved', verbose_name='Reserved', - footer=lambda table: sum(r.stats['reserved'] for r in table.data)) - stats_deprecated = tables.Column(accessor='stats.deprecated', verbose_name='Deprecated', - footer=lambda table: sum(r.stats['deprecated'] for r in table.data)) - stats_available = tables.Column(accessor='stats.available', verbose_name='Available', - footer=lambda table: sum(r.stats['available'] for r in table.data)) - utilization = tables.TemplateColumn(template_code=RIR_UTILIZATION, verbose_name='Utilization') + stats_total = tables.Column( + accessor='stats.total', + verbose_name='Total', + footer=lambda table: sum(r.stats['total'] for r in table.data) + ) + stats_active = tables.Column( + accessor='stats.active', + verbose_name='Active', + footer=lambda table: sum(r.stats['active'] for r in table.data) + ) + stats_reserved = tables.Column( + accessor='stats.reserved', + verbose_name='Reserved', + footer=lambda table: sum(r.stats['reserved'] for r in table.data) + ) + stats_deprecated = tables.Column( + accessor='stats.deprecated', + verbose_name='Deprecated', + footer=lambda table: sum(r.stats['deprecated'] for r in table.data) + ) + stats_available = tables.Column( + accessor='stats.available', + verbose_name='Available', + footer=lambda table: sum(r.stats['available'] for r in table.data) + ) + utilization = tables.TemplateColumn( + template_code=RIR_UTILIZATION, + verbose_name='Utilization' + ) class Meta(RIRTable.Meta): fields = ( diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 1d4575e34..752ab97c2 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -192,9 +192,15 @@ class RIRListView(ObjectListView): queryset = Prefix.objects.filter(prefix__net_contained_or_equal=str(aggregate.prefix)) # Find all consumed space for each prefix status (we ignore containers for this purpose). - active_prefixes = netaddr.cidr_merge([p.prefix for p in queryset.filter(status=PREFIX_STATUS_ACTIVE)]) - reserved_prefixes = netaddr.cidr_merge([p.prefix for p in queryset.filter(status=PREFIX_STATUS_RESERVED)]) - deprecated_prefixes = netaddr.cidr_merge([p.prefix for p in queryset.filter(status=PREFIX_STATUS_DEPRECATED)]) + active_prefixes = netaddr.cidr_merge( + [p.prefix for p in queryset.filter(status=PREFIX_STATUS_ACTIVE)] + ) + reserved_prefixes = netaddr.cidr_merge( + [p.prefix for p in queryset.filter(status=PREFIX_STATUS_RESERVED)] + ) + deprecated_prefixes = netaddr.cidr_merge( + [p.prefix for p in queryset.filter(status=PREFIX_STATUS_DEPRECATED)] + ) # Find all available prefixes by subtracting each of the existing prefix sets from the aggregate prefix. available_prefixes = ( @@ -205,11 +211,11 @@ class RIRListView(ObjectListView): ) # Add the size of each metric to the RIR total. - stats['total'] += aggregate.prefix.size / denominator - stats['active'] += netaddr.IPSet(active_prefixes).size / denominator - stats['reserved'] += netaddr.IPSet(reserved_prefixes).size / denominator - stats['deprecated'] += netaddr.IPSet(deprecated_prefixes).size / denominator - stats['available'] += available_prefixes.size / denominator + stats['total'] += int(aggregate.prefix.size / denominator) + stats['active'] += int(netaddr.IPSet(active_prefixes).size / denominator) + stats['reserved'] += int(netaddr.IPSet(reserved_prefixes).size / denominator) + stats['deprecated'] += int(netaddr.IPSet(deprecated_prefixes).size / denominator) + stats['available'] += int(available_prefixes.size / denominator) # Calculate the percentage of total space for each prefix status. total = float(stats['total']) @@ -229,20 +235,6 @@ class RIRListView(ObjectListView): return rirs - def extra_context(self): - - totals = { - 'total': sum([rir.stats['total'] for rir in self.queryset]), - 'active': sum([rir.stats['active'] for rir in self.queryset]), - 'reserved': sum([rir.stats['reserved'] for rir in self.queryset]), - 'deprecated': sum([rir.stats['deprecated'] for rir in self.queryset]), - 'available': sum([rir.stats['available'] for rir in self.queryset]), - } - - return { - 'totals': totals, - } - class RIRCreateView(PermissionRequiredMixin, ObjectEditView): permission_required = 'ipam.add_rir'