diff --git a/lib/config.py b/lib/config.py index d2b9c5633b124defaca9f6d665b7297f63c7ca3e..c84c1f112c5d89fd49ddd7b2ef74b95ea1338de2 100644 --- a/lib/config.py +++ b/lib/config.py @@ -376,12 +376,11 @@ class ConfigWriter: net_uuid = self._UnlockedLookupNetwork(net) nobj = self._UnlockedGetNetwork(net_uuid) pool = network.AddressPool(nobj) - gen_free = pool.GenerateFree() def gen_one(): try: - ip = gen_free() - except StopIteration: + ip = pool.GenerateFree() + except errors.AddressPoolError: raise errors.ReservationError("Cannot generate IP. Network is full") return (constants.RESERVE_ACTION, ip, net_uuid) diff --git a/lib/network.py b/lib/network.py index 31037b99117f378cd6c230fe6e5551abe9889f93..a0197053da8f40e1b765c119b53c1ef46c6cebc9 100644 --- a/lib/network.py +++ b/lib/network.py @@ -173,12 +173,14 @@ class AddressPool(object): return address def GenerateFree(self): - """A generator for free addresses.""" - def _iter_free(): - for idx in self.all_reservations.search("0", 64): - yield str(self.network[idx]) - # pylint: disable=E1101 - return _iter_free().next + """Returns the first free address of the network if any or + raises an error if it is full. + + """ + if self.IsFull(): + raise errors.AddressPoolError("%s is full" % self.network) + idx = self.all_reservations.search("0", 1) + return str(self.network[idx]) def GetExternalReservations(self): """Returns a list of all externally reserved addresses"""