Merge branch 'master' of ssh://git.onelab.eu/git/sfa
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 25 May 2011 03:22:40 +0000 (05:22 +0200)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 25 May 2011 03:22:40 +0000 (05:22 +0200)
sfa/client/sfiAddSliver.py
sfa/plc/aggregate.py
sfa/rspecs/pg_rspec.py
sfa/rspecs/rspec.py
sfa/rspecs/sfa_rspec.py

index 7716f97..a96c678 100755 (executable)
@@ -26,15 +26,15 @@ else:
     outfile=sys.stdout
 
 rspec = parse_rspec(infile)
+rspec.type = 'request'
 nodes = file(command.opts.nodefile).read().split()
 try:
     if rspec.version['type'].lower() == 'protogeni':
         rspec.xml.set('type', 'request')
-        rspec.remove_element('available')    
     slivers = [{'hostname': node} for node in nodes]
     rspec.add_slivers(slivers)
 except:
     print >> sys.stderr, "FAILED: %s" % nodes
     sys.exit(1)
-print >>outfile, rspec.toxml()
+print >>outfile, rspec.toxml(cleanup=True)
 sys.exit(0)
index 7f4fcb2..d7c03a0 100644 (file)
@@ -91,7 +91,6 @@ class Aggregate:
         if slice_xrn:
             # If slicename is specified then resulting rspec is a manifest. 
             # Add sliver details to rspec and remove 'advertisement' elements
-            rspec.remove_element('available')
             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)
@@ -114,4 +113,4 @@ class Aggregate:
                                 sliver.tags.append(tag)
                 rspec.add_slivers(slivers, sliver_urn=slice_xrn)
 
-        return rspec.toxml()          
+        return rspec.toxml(cleanup=True)          
index c715f53..2fd8b76 100755 (executable)
@@ -62,7 +62,7 @@ class PGRSpec(RSpec):
         RSpec.create(self)
         if self.type:
             self.xml.set('type', self.type) 
-        
+       
     def get_network(self):
         network = None 
         nodes = self.xml.xpath('//rspecv2:node[@component_manager_uuid][1]', namespaces=self.namespaces)
@@ -75,11 +75,12 @@ class PGRSpec(RSpec):
         return set(networks)
 
     def get_node_elements(self):
-        nodes = self.xml.xpath('//rspecv2:node', namespaces=self.namespaces)
+        nodes = self.xml.xpath('//rspecv2:node | //node', namespaces=self.namespaces)
         return nodes
 
     def get_nodes(self, network=None):
-        return self.xml.xpath('//rspecv2:node[@component_name]/@component_name', namespaces=self.namespaces) 
+        xpath = '//rspecv2:node[@component_name]/@component_name | //node[@component_name]/@component_name'
+        return self.xml.xpath(xpath, namespaces=self.namespaces) 
 
     def get_nodes_with_slivers(self, network=None):
         if network:
@@ -155,7 +156,24 @@ class PGRSpec(RSpec):
         for child in root.getchildren():
             self.xml.append(child)
                   
-    
+    def cleanup(self):
+        # remove unncecessary elements, attributes
+        if self.type in ['request', 'manifest']:
+            # remove nodes without slivers
+            nodes = self.get_node_elements()
+            for node in nodes:
+                delete = True
+                hostname = node.get('component_name')
+                parent = node.getparent()
+                children = node.getchildren()
+                for child in children:
+                    if child.tag.endswith('sliver_type'):
+                        delete = False
+                if delete:
+                    parent.remove(node)
+
+            # remove 'available' element from remaining node elements
+            self.remove_element('//rspecv2:available | //available')
 
 if __name__ == '__main__':
     rspec = PGRSpec()
index 91bac6c..ad2075b 100755 (executable)
@@ -51,11 +51,13 @@ class RSpec:
                 tree = etree.parse(StringIO(rspec), parser)
             except:
                 raise InvalidRSpec('Must specify a xml file or xml string. Received: ' + rspec )
-
         self.xml = tree.getroot()  
         if namespaces:
            self.namespaces = namespaces
 
+    def xpath(self, xpath):
+        return this.xml.xpath(xpath, namespaces=self.namespaces)
+
     def add_attribute(self, elem, name, value):
         """
         Add attribute to specified etree element    
@@ -98,8 +100,10 @@ class RSpec:
         if not root_node:
             root_node = self.xml
 
-        elements = root_node.xpath('//rspecv2:%s | //%s' % (element_name, element_name), \
-                                                            namespaces=self.namespaces)
+        if not element_name.startswith('//'):
+            element_name = '//' + element_name
+
+        elements = root_node.xpath('%s ' % element_name, namespaces=self.namespaces)
         for element in elements:
             parent = element.getparent()
             parent.remove(element)
@@ -122,10 +126,18 @@ class RSpec:
         return True
         
 
+    def cleanup(self):
+        """
+        Optional method which inheriting classes can choose to implent. 
+        """
+        pass 
+
     def __str__(self):
         return self.toxml()
 
-    def toxml(self):
+    def toxml(self, cleanup=False):
+        if cleanup:
+            self.cleanup()
         return self.header + etree.tostring(self.xml, pretty_print=True)  
         
     def save(self, filename):
index 0e73ef5..4a9dc49 100755 (executable)
@@ -19,6 +19,10 @@ class SfaRSpec(RSpec):
     header = '<?xml version="1.0"?>\n'
     version = sfa_rspec_version
 
+    def create(self):
+        RSpec.create(self)
+        self.xml.set('type', 'SFA')
+
     ###################
     # Parser
     ###################