fix bug in remove_slivers()
[sfa.git] / sfa / rspecs / sfa_rspec.py
index bc67489..2202158 100755 (executable)
@@ -11,7 +11,7 @@ class SfaRSpec(RSpec):
     xml = None
     header = '<?xml version="1.0"?>\n'
     namespaces = {}
-
+    type = 'sfa'
     ###################
     # Parser
     ###################
@@ -154,18 +154,30 @@ class SfaRSpec(RSpec):
     # Builder
     ##################
 
+    def add_network(self, network):
+        network_tag = etree.SubElement(self.xml, 'network', id=network)     
+
     def add_nodes(self, nodes, network = None, no_dupes=False):
         if not isinstance(nodes, list):
             nodes = [nodes]
         for node in nodes:
-            if check_for_dupes and \
+            if no_dupes and \
               self.get_node_element(node['hostname']):
                 # node already exists
                 continue
-                
-            node_tag = etree.SubElement(self.xml, 'node')
-            if network:
-                node_tag.set('component_manager_uuid', network)         
+
+            network_tag = self.xml
+            if 'network' in node:
+                network = node['network']
+                network_tags = self.xml.xpath('//network[@name="%s"]' % network, self.namespaces)
+                if not network_tags:
+                    network_tag = etree.SubElement(self.xml, 'network', name=network)
+                else:
+                    network_tag = network_tags[0]
+                     
+            node_tag = etree.SubElement(network_tag, 'node')
+            if 'network' in node:
+                node_tag.set('component_manager_uuid', network)
             if 'urn' in node:
                 node_tag.set('compinent_uuid', node['urn']) 
             if 'site_urn' in node:
@@ -197,10 +209,8 @@ class SfaRSpec(RSpec):
         for hostname in hostnames:
             node = self.get_node_element(hostname, network)
             sliver = node.find('sliver')
-            if sliver:    
+            if sliver != None:
                 node.remove(sliver)                 
-
-    
     
     def add_default_sliver_attribute(self, name, value, network=None):
         if network:
@@ -248,13 +258,42 @@ class SfaRSpec(RSpec):
         for vlink in vlinks:
             vlink.getparent().remove(vlink)
 
+
+    def merge(self, in_rspec):
+        """
+        Merge contents for specified rspec with current rspec 
+        """
+
+        # just copy over all networks
+        current_networks = self.get_networks()
+        rspec = SfaRSpec(rspec=in_rspec)
+        networks = rspec.get_network_elements()
+        for network in networks:
+            current_network = network.get('name')
+            if not current_network in current_networks:
+                self.xml.append(network)
+                current_networks.append(current_network)
+        
+         
+
 if __name__ == '__main__':
     rspec = SfaRSpec()
     nodes = [
-    {'hostname': 'node1.planet-lab.org',
+    {'network': 'plc',
+     'hostname': 'node1.planet-lab.org',
+     'site_urn': 'urn:publicid:IDN+plc+authority+cm',
+      'node_id': 1,
+    },
+    {'network': 'plc',
+     'hostname': 'node2.planet-lab.org',
+     'site_urn': 'urn:publicid:IDN+plc+authority+cm',
+      'node_id': 1,
+    },
+    {'network': 'ple',
+     'hostname': 'node1.planet-lab.eu',
      'site_urn': 'urn:publicid:IDN+plc+authority+cm',
       'node_id': 1,
-    }
+    },
     ]
     rspec.add_nodes(nodes)
     print rspec