advertise available pl initscripts in advertisement rspec
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Mon, 18 Jul 2011 20:31:23 +0000 (16:31 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Mon, 18 Jul 2011 20:31:23 +0000 (16:31 -0400)
sfa/plc/aggregate.py
sfa/rspecs/pg_rspec.py

index a3d3562..bdcbc8a 100644 (file)
@@ -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']:
index 0433267..f7f00dd 100755 (executable)
@@ -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 <sliver_type> 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']})