# 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.
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):
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()
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
except:
self.api.logger.log_exc('Failed to add/remove slice from nodes')
+ return nodes
def free_egre_key(self):
used = set()
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 = []
# 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
# 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')
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')