From: Tony Mack Date: Mon, 18 Jul 2011 20:31:23 +0000 (-0400) Subject: advertise available pl initscripts in advertisement rspec X-Git-Tag: sfa-1.0-28~7^2~10 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=017fdee1d2f0f15672623196137269557a74678c;p=sfa.git advertise available pl initscripts in advertisement rspec --- diff --git a/sfa/plc/aggregate.py b/sfa/plc/aggregate.py index a3d35624..bdcbc8a0 100644 --- a/sfa/plc/aggregate.py +++ b/sfa/plc/aggregate.py @@ -13,6 +13,7 @@ class Aggregate: interfaces = {} links = {} node_tags = {} + pl_initscripts = {} prepared=False #panos new user options variable user_options = {} @@ -45,6 +46,11 @@ class Aggregate: for node_tag in self.api.plshell.GetNodeTags(self.api.plauth): self.node_tags[node_tag['node_tag_id']] = node_tag + def prepare_pl_initscripts(self, force=False): + if not self.pl_initscripts or force: + for initscript in self.api.plshell.GetInitScripts(self.api.plauth, {'enabled': True}): + self.pl_initscripts[initscript['initscript_id']] = initscript + def prepare(self, force=False): if not self.prepared or force: self.prepare_sites(force) @@ -52,6 +58,7 @@ class Aggregate: self.prepare_interfaces(force) self.prepare_links(force) self.prepare_node_tags(force) + self.prepare_pl_initscripts() # add site/interface info to nodes for node_id in self.nodes: node = self.nodes[node_id] @@ -95,6 +102,9 @@ class Aggregate: # filter out nodes with a whitelist: valid_nodes = [] for node in self.nodes.values(): + # only doing this becuase protogeni rspec needs + # to advertise available initscripts + node['pl_initscripts'] = self.pl_initscripts if not node['slice_ids_whitelist']: valid_nodes.append(node) elif slice and slice['slice_id'] in node['slice_ids_whitelist']: diff --git a/sfa/rspecs/pg_rspec.py b/sfa/rspecs/pg_rspec.py index 0433267d..f7f00dd7 100755 --- a/sfa/rspecs/pg_rspec.py +++ b/sfa/rspecs/pg_rspec.py @@ -106,8 +106,6 @@ class PGRSpec(RSpec): return [] def get_sliver_attributes(self, hostname, network=None): - from sfa.util.sfalogging import logger - logger.info("node: " + hostname) node = self.get_node_element(hostname, network) sliver = node.xpath('./rspecv2:sliver_type', namespaces=self.namespaces) if sliver is not None and isinstance(sliver, list): @@ -174,6 +172,11 @@ class PGRSpec(RSpec): node_type_tag = etree.SubElement(node_tag, 'hardware_type', name='pc') available_tag = etree.SubElement(node_tag, 'available', now='true') sliver_type_tag = etree.SubElement(node_tag, 'sliver_type', name='plab-vnode') + + pl_initscripts = node.get('pl_initscripts', {}) + for pl_initscript in pl_initscripts.values(): + etree.SubElement(sliver_type_tag, '{%s}initscript' % self.namespaces['planetlab'], name=pl_initscript['name']) + # protogeni uses the tag to identify the types of # vms available at the node. # only add location tag if longitude and latitude are not null @@ -208,14 +211,19 @@ class PGRSpec(RSpec): node_id = sliver_info.get('node_id', -1) sliver_id = urn_to_sliver_id(sliver_urn, slice_id, node_id) node.set('sliver_id', sliver_id) - sliver_elem = node.xpath('//rspecv2:sliver_type | //sliver_type', namespaces=self.namespaces) + + # remove existing sliver_type tags,it needs to be recreated + sliver_elem = node.xpath('./rspecv2:sliver_type | ./sliver_type', namespaces=self.namespaces) if sliver_elem and isinstance(sliver_elem, list): sliver_elem = sliver_elem[0] - for tag in sliver_info['tags']: - if tag['tagname'] == 'flack_info': - e = etree.SubElement(sliver_elem, '{%s}info' % self.namespaces['flack'], attrib=eval(tag['value'])) - elif tag['tagname'] == 'initscript': - e = etree.SubElement(sliver_elem, '{%s}initscript' % self.namespaces['planetlab'], attrib={'name': tag['value']}) + node.remove(sliver_elem) + + sliver_elem = etree.SubElement(node, 'sliver_type', name='plab-vnode') + for tag in sliver_info['tags']: + if tag['tagname'] == 'flack_info': + e = etree.SubElement(sliver_elem, '{%s}info' % self.namespaces['flack'], attrib=eval(tag['value'])) + elif tag['tagname'] == 'initscript': + e = etree.SubElement(sliver_elem, '{%s}initscript' % self.namespaces['planetlab'], attrib={'name': tag['value']})