Merge branch 'master' into eucalyptus-devel
[sfa.git] / sfa / managers / vini / vini_network.py
index 8e069b3..fcade6c 100644 (file)
@@ -113,7 +113,8 @@ class ViniNode(Node):
         remote_ip = remote.get_virt_ip(self)
         net = self.get_virt_net(remote)
         bw = format_tc_rate(link.bps)
-        return (remote.id, remote.ipaddr, bw, my_ip, remote_ip, net)
+        ipaddr = remote.get_primary_iface().ipv4
+        return (remote.id, ipaddr, bw, my_ip, remote_ip, net)
         
     def add_link(self, link):
         self.links.add(link)
@@ -138,8 +139,7 @@ class ViniNode(Node):
                 xml << self.hostname
             with xml.bw_unallocated(units="kbps"):
                 xml << str(int(self.bps/1000))
-            for iface in self.get_ifaces():
-                iface.toxml(xml)
+            self.get_primary_iface().toxml(xml)
             if self.sliver:
                 self.sliver.toxml(xml)
 
@@ -154,19 +154,19 @@ class ViniSite(Site):
 
 class ViniSlice(Slice):
     def assign_egre_key(self):
-        if not self.get_tag('egre_key'):
+        tag = self.get_tag('egre_key')
+        if not tag:
             try:
-                key = free_egre_key()
-                self.update_tag('egre_key', key)
+                key = self.network.free_egre_key()
             except:
-                # Should handle this case...
-                pass
+                raise InvalidRSpec("ran out of EGRE keys!")
+            tag = self.update_tag('egre_key', key, None, 'admin')
         return
             
     def turn_on_netns(self):
         tag = self.get_tag('netns')
         if (not tag) or (tag.value != '1'):
-            self.update_tag('netns', '1')
+            tag = self.update_tag('netns', '1', None, 'admin')
         return
    
     def turn_off_netns(self):
@@ -181,12 +181,13 @@ class ViniSlice(Slice):
             caps = tag.value.split(',')
             for cap in caps:
                 if cap == "CAP_NET_ADMIN":
-                    return
+                    newcaps = tag.value
+                    break
             else:
                 newcaps = "CAP_NET_ADMIN," + tag.value
-                self.update_tag('capabilities', newcaps)
+            self.update_tag('capabilities', newcaps, None, 'admin')
         else:
-            self.add_tag('capabilities', 'CAP_NET_ADMIN')
+            tag = self.add_tag('capabilities', 'CAP_NET_ADMIN', None, 'admin')
         return
     
     def remove_cap_net_admin(self):
@@ -199,28 +200,11 @@ class ViniSlice(Slice):
                     newcaps.append(cap)
             if newcaps:
                 value = ','.join(newcaps)
-                self.update_tag('capabilities', value)
+                self.update_tag('capabilities', value, None, 'admin')
             else:
                 tag.delete()
         return
 
-    # Update the vsys/setup-link and vsys/setup-nat slice tags.
-    def add_vsys_tags(self):
-        link = nat = False
-        for tag in self.network.getSliceTags():
-            if tag.tagname == 'vsys':
-                if tag.value == 'setup-link':
-                    link = True
-                elif tag.value == 'setup-nat':
-                    nat = True
-        if not link:
-            self.add_tag('vsys', 'setup-link')
-        if not nat:
-            self.add_tag('vsys', 'setup-nat')
-        return
-
-
-
 class Link:
     def __init__(self, end1, end2, bps = 1000 * 1000000, parent = None):
         self.end1 = end1
@@ -242,7 +226,7 @@ class Link:
             with  xml.vlink(endpoints=end_ids):
                 with xml.description:
                     xml << "%s -- %s" % (self.end1.name, self.end2.name)
-                with xml.bw(units="kbps"):
+                with xml.kbps:
                     xml << str(int(self.bps/1000))
         else:
             with xml.link(endpoints=end_ids):
@@ -256,7 +240,7 @@ class Link:
 
 
 class ViniNetwork(Network):
-    def __init__(self, api, type = "VINI"):
+    def __init__(self, api, type = "SFA"):
         Network.__init__(self, api, type)
         self.sitelinks = []
         self.nodelinks = []
@@ -362,11 +346,11 @@ class ViniNetwork(Network):
         # Find vlinks under link elements
         for vlink in self.rspec.iterfind("./network/link/vlink"):
             link = vlink.getparent()
-            self.__add_vlink(vlink, slicenodes, link)
+            self.__add_vlink(vlink, link)
 
         # Find vlinks that specify endpoints
-        for vlink in rspec.iterfind("./request/vlink[@endpoints]"):
-            self.__add_vlink(vlink, slicenodes)
+        for vlink in self.rspec.iterfind("./request/vlink[@endpoints]"):
+            self.__add_vlink(vlink)
 
 
     def addSlice(self):
@@ -387,32 +371,55 @@ class ViniNetwork(Network):
     def updateSliceTags(self):
         slice = self.slice
 
-        slice.update_tag('vini_topo', 'manual')
+        tag = slice.update_tag('vini_topo', 'manual', None, 'admin')
         slice.assign_egre_key()
         slice.turn_on_netns()
         slice.add_cap_net_admin()
 
-        for node in slice.get_nodes():
+        for node in self.nodesWithSlivers():
             linkdesc = []
             for link in node.links:
                 linkdesc.append(node.get_topo_rspec(link))
             if linkdesc:
                 topo_str = "%s" % linkdesc
-                slice.update_tag('topo_rspec', topo_str, node)
+                tag = slice.update_tag('topo_rspec', topo_str, node, 'admin')
+
+        # Expire the un-updated topo_rspec tags
+        for tag in self.getSliceTags():
+            if tag.tagname in ['topo_rspec']:
+                if not tag.was_updated():
+                    tag.delete()
 
         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.
     """
     def toxml(self):
         xml = XMLBuilder(format = True, tab_step = "  ")
         with xml.RSpec(type=self.type):
-            name = "Public_" + self.type
             if self.slice:
-                element = xml.network(name=name, slice=self.slice.hrn)
+                element = xml.network(name=self.api.hrn, slice=self.slice.hrn)
             else:
-                element = xml.network(name=name)
+                element = xml.network(name=self.api.hrn)
 
             with element:
                 if self.slice: