|
@@ -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,
|
|
|
- })
|