X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/48616625d572668b0ce762ff47af871d1a84f55b..def6577f00a482c310f4e20bb315fa90290ad5b7:/lib/network.py diff --git a/lib/network.py b/lib/network.py index a1c51c5..d78b717 100644 --- a/lib/network.py +++ b/lib/network.py @@ -30,6 +30,21 @@ from bitarray import bitarray from ganeti import errors +def _ComputeIpv4NumHosts(network_size): + """Derives the number of hosts in an IPv4 network from the size. + + """ + return 2 ** (32 - network_size) + + +IPV4_NETWORK_MIN_SIZE = 30 +# FIXME: This limit is for performance reasons. Remove when refactoring +# for performance tuning was successful. +IPV4_NETWORK_MAX_SIZE = 16 +IPV4_NETWORK_MIN_NUM_HOSTS = _ComputeIpv4NumHosts(IPV4_NETWORK_MIN_SIZE) +IPV4_NETWORK_MAX_NUM_HOSTS = _ComputeIpv4NumHosts(IPV4_NETWORK_MAX_SIZE) + + class AddressPool(object): """Address pool class, wrapping an C{objects.Network} object. @@ -55,6 +70,19 @@ class AddressPool(object): self.net = network self.network = ipaddr.IPNetwork(self.net.network) + if self.network.numhosts > IPV4_NETWORK_MAX_NUM_HOSTS: + raise errors.AddressPoolError("A big network with %s host(s) is currently" + " not supported. please specify at most a" + " /%s network" % + (str(self.network.numhosts), + IPV4_NETWORK_MAX_SIZE)) + + if self.network.numhosts < IPV4_NETWORK_MIN_NUM_HOSTS: + raise errors.AddressPoolError("A network with only %s host(s) is too" + " small, please specify at least a /%s" + " network" % + (str(self.network.numhosts), + IPV4_NETWORK_MIN_SIZE)) if self.net.gateway: self.gateway = ipaddr.IPAddress(self.net.gateway)