From a998bf400c1ef152daa4979fec49ee5dfa0d7ff3 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Thu, 8 Dec 2011 14:42:03 -0500 Subject: [PATCH] fix verify_slice_links() --- sfa/managers/aggregate_manager.py | 4 ++-- sfa/plc/plaggregate.py | 17 +++++++------- sfa/plc/plslices.py | 29 +++++++++++++++++------- sfa/rspecs/elements/versions/pgv2Link.py | 6 ++--- sfa/rspecs/versions/sfav1.py | 9 +++++--- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/sfa/managers/aggregate_manager.py b/sfa/managers/aggregate_manager.py index c49b0d7d..4a9573b1 100644 --- a/sfa/managers/aggregate_manager.py +++ b/sfa/managers/aggregate_manager.py @@ -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. diff --git a/sfa/plc/plaggregate.py b/sfa/plc/plaggregate.py index 3b32a90a..1fed4558 100644 --- a/sfa/plc/plaggregate.py +++ b/sfa/plc/plaggregate.py @@ -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() diff --git a/sfa/plc/plslices.py b/sfa/plc/plslices.py index 5dc20329..d5aba398 100644 --- a/sfa/plc/plslices.py +++ b/sfa/plc/plslices.py @@ -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 diff --git a/sfa/rspecs/elements/versions/pgv2Link.py b/sfa/rspecs/elements/versions/pgv2Link.py index 44317be2..5e0a8282 100644 --- a/sfa/rspecs/elements/versions/pgv2Link.py +++ b/sfa/rspecs/elements/versions/pgv2Link.py @@ -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') diff --git a/sfa/rspecs/versions/sfav1.py b/sfa/rspecs/versions/sfav1.py index 8f172bd8..7ec164d9 100644 --- a/sfa/rspecs/versions/sfav1.py +++ b/sfa/rspecs/versions/sfav1.py @@ -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') -- 2.47.0