Added free_egre_key()
authorAndy Bavier <acb@cs.princeton.edu>
Wed, 10 Feb 2010 18:01:49 +0000 (18:01 +0000)
committerAndy Bavier <acb@cs.princeton.edu>
Wed, 10 Feb 2010 18:01:49 +0000 (18:01 +0000)
sfa/managers/vini/vini_network.py

index 06f135d..5ccf57c 100644 (file)
@@ -157,10 +157,9 @@ class ViniSlice(Slice):
         tag = self.get_tag('egre_key')
         if not tag:
             try:
-                key = free_egre_key()
+                key = self.network.free_egre_key()
             except:
-                # Should handle this case...
-                raise Error("ran out of EGRE keys!")
+                raise InvalidRSpec("ran out of EGRE keys!")
             tag = self.update_tag('egre_key', key, None, 10)
         return
             
@@ -393,6 +392,24 @@ class ViniNetwork(Network):
 
         Network.updateSliceTags(self)
 
+    """
+    Find a free EGRE key
+    """
+    def free_egre_key(self):
+        used = set()
+        for tag in self.getSliceTags():
+            if tag.tagname == 'egre_key':
+                used.add(int(tag.value))
+                
+        for i in range(1, 256):
+            if i not in used:
+                key = i
+                break
+        else:
+            raise KeyError("No more EGRE keys available")
+        
+        return str(key)
+
     """
     Produce XML directly from the topology specification.
     """