From 4f9ad861e58336f41b0a3bd59ddd8b932b58f0c1 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Mon, 9 May 2011 16:37:21 -0400 Subject: [PATCH] expose slice tags in SFA RSepc --- sfa/managers/aggregate_manager_pl.py | 7 +----- sfa/plc/aggregate.py | 20 ++++++++++++--- sfa/rspecs/pg_rspec.py | 9 ++++--- sfa/rspecs/sfa_rspec.py | 37 +++++++++++++++------------- 4 files changed, 43 insertions(+), 30 deletions(-) diff --git a/sfa/managers/aggregate_manager_pl.py b/sfa/managers/aggregate_manager_pl.py index 7bb94edc..e44f7bf7 100644 --- a/sfa/managers/aggregate_manager_pl.py +++ b/sfa/managers/aggregate_manager_pl.py @@ -316,12 +316,7 @@ def ListResources(api, creds, options,call_id): aggregate = Aggregate(api) - if xrn: - # get this rspec for the specified slice - rspec = aggregate.get_rspec(slice_xrn=hrn, version=rspec_version) - else: - # generate rspec in both pg and sfa formats - rspec = aggregate.get_rspec(version=rspec_version) + rspec = aggregate.get_rspec(slice_xrn=xrn, version=rspec_version) # cache the result if caching and api.cache and not xrn: diff --git a/sfa/plc/aggregate.py b/sfa/plc/aggregate.py index 4073243c..1ba75d2d 100644 --- a/sfa/plc/aggregate.py +++ b/sfa/plc/aggregate.py @@ -81,12 +81,26 @@ class Aggregate: rspec.add_links(self.links.values()) if slice_xrn: + # get slice details slice_hrn, _ = urn_to_hrn(slice_xrn) slice_name = hrn_to_pl_slicename(slice_hrn) slices = self.api.plshell.GetSlices(self.api.plauth, slice_name) if slices: - slice = slices[0] - hostnames = [self.nodes[node_id]['hostname'] for node_id in slice['node_ids']] - rspec.add_slivers(hostnames) + slice = slices[0] + slivers = [] + tags = self.api.plshell.GetSliceTags(self.api.plauth, slice['slice_tag_ids']) + for node_id in slice['node_ids']: + sliver = {} + sliver['hostname'] = self.nodes[node_id]['hostname'] + sliver['tags'] = [] + for tag in tags: + # if tag isn't bound to a node then it applies to all slivers + if not tag['node_id']: + sliver['tags'].append(tag) + else: + tag_host = self.nodes[tag['node_id']]['hostname'] + if tag_host == sliver['hostname']: + sliver.tags.append(tag) + rspec.add_slivers(slivers) return rspec.toxml() diff --git a/sfa/rspecs/pg_rspec.py b/sfa/rspecs/pg_rspec.py index a68bd318..d1c4ea7e 100755 --- a/sfa/rspecs/pg_rspec.py +++ b/sfa/rspecs/pg_rspec.py @@ -73,12 +73,13 @@ class PGRSpec(RSpec): #if 'interfaces' in node: - def add_slivers(self, hostnames, check_for_dupes=False): - if not isinstance(hostnames, list): - hostnames = [hostnames] + def add_slivers(self, slivers, check_for_dupes=False): + if not isinstance(slivers, list): + slivers = [slivers] nodes_with_slivers = self.get_nodes_with_slivers() - for hostname in hostnames: + for sliver in slivers: + hostname = sliver['hostname'] if hostname in nodes_with_slivers: continue nodes = self.xml.xpath('//rspecv2:node[@component_name="%s"] | //node[@component_name="%s"]' % (hostname, hostname), namespaces=self.namespaces) diff --git a/sfa/rspecs/sfa_rspec.py b/sfa/rspecs/sfa_rspec.py index dba7821c..1085811a 100755 --- a/sfa/rspecs/sfa_rspec.py +++ b/sfa/rspecs/sfa_rspec.py @@ -189,7 +189,7 @@ class SfaRSpec(RSpec): if 'interfaces' in node: for interface in node['interfaces']: if 'bwlimit' in interface and interface['bwlimit']: - bwlimit = etree.SubElement(node_tag, 'bwlimit', units='kbps').tet = str(interface['bwlimit']/1000) + bwlimit = etree.SubElement(node_tag, 'bw_limit', units='kbps').tet = str(interface['bwlimit']/1000) if 'tags' in node: for tag in node['tags']: # expose this hard wired list of tags, plus the ones that are marked 'sfa' in their category @@ -202,25 +202,28 @@ class SfaRSpec(RSpec): def add_links(self, links): pass - def add_slivers(self, hostnames, network=None, no_dupes=False): - if not isinstance(hostnames, list): - hostnames = [hostnames] + def add_slivers(self, slivers, network=None, no_dupes=False): + if not isinstance(slivers, list): + slivers = [slivers] nodes_with_slivers = self.get_nodes_with_slivers(network) - for hostname in hostnames: - if hostname in nodes_with_slivers: + for sliver in slivers: + if sliver['hostname'] in nodes_with_slivers: continue - node = self.get_node_element(hostname, network) - etree.SubElement(node, 'sliver') - - def remove_slivers(self, hostnames, network=None, no_dupes=False): - if not isinstance(hostnames, list): - hostnames = [hostnames] - for hostname in hostnames: - node = self.get_node_element(hostname, network) - sliver = node.find('sliver') - if sliver != None: - node.remove(sliver) + node_elem = self.get_node_element(sliver['hostname'], network) + sliver_elem = etree.SubElement(node_elem, 'sliver') + if 'tags' in sliver: + for tag in sliver['tags']: + etree.SubElement(sliver_elem, tag['name'], value=tag['value'] + + def remove_slivers(self, slivers, network=None, no_dupes=False): + if not isinstance(slivers, list): + slivers = [slivers] + for sliver in slivers: + node_elem = self.get_node_element(sliver['hostname'], network) + sliver_elem = node.find('sliver') + if sliver_elem != None: + node_elem.remove(sliver) def add_default_sliver_attribute(self, name, value, network=None): if network: -- 2.43.0