Simplify GenerateFree in network module
authorDimitris Aragiorgis <dimara@grnet.gr>
Mon, 29 Oct 2012 19:00:06 +0000 (21:00 +0200)
committerDimitris Aragiorgis <dimara@grnet.gr>
Tue, 30 Oct 2012 13:37:15 +0000 (15:37 +0200)
GenerateFree now returns the first available IP in the network
or raises AddressPoolError if it is full.

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>

lib/config.py
lib/network.py

index a18789d..0539f52 100644 (file)
@@ -369,12 +369,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)
 
index 96ed654..27a25a7 100644 (file)
@@ -169,12 +169,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])
+    """Returns the first free address of the network if any or
+       raises an error if it is full.
 
-    return _iter_free().next
+    """
+    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"""