from __future__ import unicode_literals, print_function
"""
Gettings stats out of NSoT.
"""
from netaddr import IPNetwork, IPSet
__all__ = ('calculate_network_utilization', 'get_network_utilization')
[docs]def calculate_network_utilization(parent, hosts, as_string=False):
"""
Calculate utilization for a network and its descendants.
:param parent:
The parent network
:param hosts:
List of host IPs descendant from parent
:param as_string:
Whether to return stats as a string
"""
parent = IPNetwork(str(parent))
hosts = IPSet(str(ip) for ip in hosts if IPNetwork(str(ip)) in parent)
used = float(hosts.size) / float(parent.size)
free = 1 - used
num_free = parent.size - hosts.size
stats = {
'percent_used': used,
'num_used': hosts.size,
'percent_free': free,
'num_free': num_free,
'max': parent.size,
}
# 10.47.216.0/22 - 14% used (139), 86% free (885)
if as_string:
return '{} - {:.0%} used ({}), {:.0%} free ({})'.format(
parent, used, hosts.size, free, num_free
)
return stats
[docs]def get_network_utilization(network, as_string=False):
"""
Get utilization from Network instance.
:param network:
A Network model instance
:param as_string:
Whether to return stats as a string
"""
descendants = network.get_descendants().filter(is_ip=True)
return calculate_network_utilization(network, descendants, as_string)