fix verify_slice_links()
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Thu, 8 Dec 2011 19:42:03 +0000 (14:42 -0500)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Thu, 8 Dec 2011 19:42:03 +0000 (14:42 -0500)
sfa/managers/aggregate_manager.py
sfa/plc/plaggregate.py
sfa/plc/plslices.py
sfa/rspecs/elements/versions/pgv2Link.py
sfa/rspecs/versions/sfav1.py

index c49b0d7..4a9573b 100644 (file)
@@ -133,10 +133,10 @@ class AggregateManager:
         
         # add/remove slice from nodes
         requested_slivers = [node.get('component_name') for node in rspec.version.get_nodes_with_slivers()]
-        slices.verify_slice_nodes(slice, requested_slivers, peer) 
+        nodes = slices.verify_slice_nodes(slice, requested_slivers, peer) 
    
         # add/remove links links 
-        slices.verify_slice_links(slice, rspec.version.get_link_requests(), aggregate)
+        slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes)
     
         # handle MyPLC peer association.
         # only used by plc and ple.
index 3b32a90..1fed455 100644 (file)
@@ -21,13 +21,10 @@ from sfa.plc.topology import Topology
 
 class PlAggregate:
 
-    api = None
-    #panos new user options variable
-    user_options = {}
-
     def __init__(self, driver):
         self.driver = driver
-    
+        self.user_options = {}
     def get_sites(self, filter={}):
         sites = {}
         for site in self.driver.GetSites(filter):
@@ -245,10 +242,12 @@ class PlAggregate:
         rspec.version.add_links(links)
         
         # add sliver defaults
-        default_sliver_attribs = slivers.get(None, [])
-        for sliver_attrib in default_sliver_attribs:
-            rspec.version.add_default_sliver_attribute(sliver_attrib['name'], sliver_attrib['value'])  
-        
+        default_sliver = slivers.get(None, [])
+        if default_sliver:
+            default_sliver_attribs = default_sliver.get('tags', [])
+            for attrib in default_sliver_attribs:
+                logger.info(attrib)
+                rspec.version.add_default_sliver_attribute(attrib['tagname'], attrib['value'])
         return rspec.toxml()
 
 
index 5dc2032..d5aba39 100644 (file)
@@ -166,7 +166,7 @@ class PlSlices:
 
     def verify_slice_nodes(self, slice, requested_slivers, peer):
         
-        nodes = self.api.driver.GetNodes(slice['node_ids'], ['hostname'])
+        nodes = self.api.driver.GetNodes(slice['node_ids'], ['node_id', 'hostname', 'interface_ids'])
         current_slivers = [node['hostname'] for node in nodes]
 
         # remove nodes not in rspec
@@ -183,6 +183,7 @@ class PlSlices:
 
         except: 
             self.api.logger.log_exc('Failed to add/remove slice from nodes')
+        return nodes
 
     def free_egre_key(self):
         used = set()
@@ -198,10 +199,22 @@ class PlSlices:
 
         return str(key)
 
-    def verify_slice_links(self, slice, links, aggregate):
+    def verify_slice_links(self, slice, requested_links, nodes):
         # nodes is undefined here
-        if not links:
+        if not requested_links:
             return
+   
+        # build dict of nodes 
+        nodes_dict = {}
+        interface_ids = []
+        for node in nodes:
+            nodes_dict[node['node_id']] = node
+            interface_ids.extend(node['interface_ids'])
+        # build dict of interfaces
+        interfaces = self.api.driver.GetInterfaces(interface_ids)
+        interfaces_dict = {}
+        for interface in interfaces:
+            interfaces_dict[interface['interface_id']] = interface 
 
         slice_tags = []
         
@@ -215,13 +228,13 @@ class PlSlices:
         # need to update the attribute string?
         slice_tags.append({'name': 'capabilities', 'value': 'CAP_NET_ADMIN'}) 
         
-        for link in links:
+        for link in requested_links:
             # get the ip address of the first node in the link
             ifname1 = Xrn(link['interface1']['component_id']).get_leaf()
-            (node, device) = ifname1.split(':')
-            node_id = int(node.replace('node', ''))
-            node = aggregate.nodes[node_id]
-            if1 = aggregate.interfaces[node['interface_ids'][0]]
+            (node_raw, device) = ifname1.split(':')
+            node_id = int(node_raw.replace('node', ''))
+            node = nodes_dict[node_id]
+            if1 = interfaces_dict[node['interface_ids'][0]]
             ipaddr = if1['ip']
             topo_rspec = VLink.get_topo_rspec(link, ipaddr)
             # set topo_rspec tag
index 44317be..5e0a828 100644 (file)
@@ -49,11 +49,11 @@ class PGv2Link:
             # get capacity, latency and packet_loss from first property  
             property_fields = ['capacity', 'latency', 'packet_loss']
             property_elems = link_elem.xpath('./default:property | ./property')
-            if len(propery_elems) > 0:
+            if len(property_elems) > 0:
                 prop = property_elems[0]
                 for attrib in ['capacity', 'latency', 'packet_loss']:
-                    if attrib in prop:
-                        link[attrib] = prop[attrib]
+                    if attrib in prop.attrib:
+                        link[attrib] = prop.attrib[attrib]
                              
             # get interfaces
             iface_elems = link_elem.xpath('./default:interface_ref | ./interface_ref')
index 8f172bd..7ec164d 100644 (file)
@@ -139,9 +139,12 @@ class SFAv1(BaseVersion):
         if network:
             defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network)
         else:
-            defaults = self.xml.xpath("//sliver_defaults" % network)
-        if not defaults :
-            network_tag = self.xml.xpath("//network[@name='%s']" % network)
+            defaults = self.xml.xpath("//sliver_defaults")
+        if not defaults:
+            if network:
+                network_tag = self.xml.xpath("//network[@name='%s']" % network)
+            else:
+                network_tag = self.xml.xpath("//network")    
             if isinstance(network_tag, list):
                 network_tag = network_tag[0]
             defaults = network_tag.add_element('sliver_defaults')