Source code for nsot.util.stats

"""
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 f"{parent} - {used:.0%} used ({hosts.size}), {free:.0%} 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)