add_slivers() will remove nodes that don't have slivers
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Tue, 4 Oct 2011 20:40:24 +0000 (16:40 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Tue, 4 Oct 2011 20:40:24 +0000 (16:40 -0400)
sfa/rspecs/versions/sfav1.py

index 4712d95..a9c3844 100644 (file)
@@ -257,18 +257,24 @@ class SFAv1(BaseVersion):
             network_tag = network_tags[0]
             network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
         
-        nodes_with_slivers = self.get_nodes_with_slivers(network)
+        all_nodes = self.get_nodes()
+        nodes_with_slivers = [sliver['hostname'] for sliver in slivers]
+        nodes_without_slivers = set(all_nodes).difference(nodes_with_slivers)
+        
+        # add slivers
         for sliver in slivers:
-            if isinstance(sliver, basestring):
-                sliver = {'hostname': sliver}
-            if sliver['hostname'] in nodes_with_slivers:
-                continue
             node_elem = self.get_node_element(sliver['hostname'], network)
+            if not node_elem: continue
             sliver_elem = etree.SubElement(node_elem, 'sliver')
             if 'tags' in sliver:
                 for tag in sliver['tags']:
                     etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value']
-
+            
+        # remove all nodes without slivers
+        for node in nodes_without_slivers:
+            node_elem = self.get_node_element(node, network)
+            parent = node_elem.getparent()
+            parent.remove(node_elem)
 
     def remove_slivers(self, slivers, network=None, no_dupes=False):
         for sliver in slivers: