1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Incorporated stats into RIR list view

This commit is contained in:
Jeremy Stretch
2016-11-11 12:45:24 -05:00
parent 13cdc44caf
commit d891c8c981
5 changed files with 125 additions and 167 deletions

View File

@@ -158,6 +158,79 @@ class RIRListView(ObjectListView):
edit_permissions = ['ipam.change_rir', 'ipam.delete_rir']
template_name = 'ipam/rir_list.html'
def alter_queryset(self, request):
# Count /64s for IPv6 rather than individual IPs
family = 4
denominator = 2 ** 64 if family == 6 else 1
rirs = []
for rir in self.queryset:
stats = {
'total': 0,
'active': 0,
'reserved': 0,
'deprecated': 0,
'available': 0,
}
aggregate_list = Aggregate.objects.filter(family=family, rir=rir)
for aggregate in aggregate_list:
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)])
# Find all available prefixes by subtracting each of the existing prefix sets from the aggregate prefix.
available_prefixes = (
netaddr.IPSet([aggregate.prefix])
- netaddr.IPSet(active_prefixes)
- netaddr.IPSet(reserved_prefixes)
- netaddr.IPSet(deprecated_prefixes)
)
# 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
# Calculate the percentage of total space for each prefix status.
total = float(stats['total'])
stats['percentages'] = {
'active': float('{:.2f}'.format(stats['active'] / total * 100)) if total else 0,
'reserved': float('{:.2f}'.format(stats['reserved'] / total * 100)) if total else 0,
'deprecated': float('{:.2f}'.format(stats['deprecated'] / total * 100)) if total else 0,
}
stats['percentages']['available'] = (
100
- stats['percentages']['active']
- stats['percentages']['reserved']
- stats['percentages']['deprecated']
)
rir.stats = stats
rirs.append(rir)
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 RIREditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'ipam.change_rir'
@@ -656,76 +729,3 @@ class VLANBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_vlan'
cls = VLAN
default_redirect_url = 'ipam:vlan_list'
#
# Miscellaneous
#
def rir_stats(request, family=4):
denominator = 2 ** 64 if family == 6 else 1
stats = OrderedDict()
for rir in RIR.objects.all():
stats[rir] = {
'total': 0,
'active': 0,
'reserved': 0,
'deprecated': 0,
'available': 0,
}
aggregate_list = Aggregate.objects.filter(family=family, rir=rir)
for aggregate in aggregate_list:
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)])
# Find all available prefixes by subtracting each of the existing prefix sets from the aggregate prefix.
available_prefixes = (
netaddr.IPSet([aggregate.prefix])
- netaddr.IPSet(active_prefixes)
- netaddr.IPSet(reserved_prefixes)
- netaddr.IPSet(deprecated_prefixes)
)
# Add the size of each metric to the RIR total.
stats[rir]['total'] += aggregate.prefix.size / denominator
stats[rir]['active'] += netaddr.IPSet(active_prefixes).size / denominator
stats[rir]['reserved'] += netaddr.IPSet(reserved_prefixes).size / denominator
stats[rir]['deprecated'] += netaddr.IPSet(deprecated_prefixes).size / denominator
stats[rir]['available'] += available_prefixes.size / denominator
# Calculate the percentage of total space for each prefix status.
total = float(stats[rir]['total'])
stats[rir]['percentages'] = {
'active': float('{:.2f}'.format(stats[rir]['active'] / total * 100)) if total else 0,
'reserved': float('{:.2f}'.format(stats[rir]['reserved'] / total * 100)) if total else 0,
'deprecated': float('{:.2f}'.format(stats[rir]['deprecated'] / total * 100)) if total else 0,
'available': float('{:.2f}'.format(stats[rir]['available'] / total * 100)) if total else 0,
}
stats[rir]['percentages']['available'] = (
100
- stats[rir]['percentages']['active']
- stats[rir]['percentages']['reserved']
- stats[rir]['percentages']['deprecated']
)
totals = {
'total': sum([counts['total'] for rir, counts in stats.items()]),
'active': sum([counts['active'] for rir, counts in stats.items()]),
'reserved': sum([counts['reserved'] for rir, counts in stats.items()]),
'deprecated': sum([counts['deprecated'] for rir, counts in stats.items()]),
'available': sum([counts['available'] for rir, counts in stats.items()]),
}
return render(request, 'ipam/stats.html', {
'stats': stats,
'totals': totals,
'family': family,
})