initial checkin
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Tue, 5 Jul 2011 12:12:08 +0000 (08:12 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Tue, 5 Jul 2011 12:12:08 +0000 (08:12 -0400)
sfa/rspecs/elements/SFAv1Sliver.py [new file with mode: 0755]

diff --git a/sfa/rspecs/elements/SFAv1Sliver.py b/sfa/rspecs/elements/SFAv1Sliver.py
new file mode 100755 (executable)
index 0000000..eea5032
--- /dev/null
@@ -0,0 +1,97 @@
+#!/usr/bin/python
+
+from sfa.rspecs.elements.sliver import Sliver
+from sfa.rspecs.elements.SFAv1Node import SFVv1Node
+
+class SFAv1Sliver(Sliver):
+
+    def get_sliver_elements(self, network=None):
+        if network:
+            slivers = self.root_node.xpath('//network[@name="%s"]//node/sliver' % network)
+        else:
+            slivers = self.root_node.xpath('//node/sliver')
+        return slivers
+
+    def get_slivers(self, network=None):
+        sliver_elems = self.get_sliver_elements(network)
+        slivers = [self.get_attributes(sliver_elem, recursive=True) \
+                 for sliver_elem in sliver_elems]
+        return slivers
+
+    def add_slivers(self, slivers, network=None):
+        if not isinstance(slivers, list):
+            slivers = [slivers]
+        nodes = SfaV1Node(self.root_node) 
+        for sliver in slivers:
+            if isinstance(sliver, basestring):
+                sliver = {'hostname': sliver}
+            if 'hostname' in sliver:
+                node_elem = nodes.get_node_elements(hostnames=sliver['hostname'])
+                if node_elem:
+                    node_elem[0]
+                sliver_elem = self.add_element('sliver', parent=node_elem)
+                if 'tags' in sliver:
+                    for tag in sliver['tags']:
+                        self.add_element(tag['tagname'], parent=sliver_elem, text=tag['value'])
+
+    def remove_slivers(self, slivers, network=node):
+        nodes = SfaV1Node(self.root_node) 
+        for sliver in slivers:
+            if isinstance(sliver, str):
+                hostname = sliver
+            else:
+                hostname = sliver['hostname']
+            node_elem = nodes.get_node_elements(network=network, hostnames=hostname)
+            sliver_elem = node_elem.find('sliver')
+            if sliver_elem != None:
+                node_elem.remove(sliver_elem)    
+                         
+                
+    def get_sliver_defaults(self, network=None):
+        if network:
+            defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network)     
+        else:
+            defaults = self.xml.xpath("//network/sliver_defaults" % network)
+        return self.attributes_list(defaults)
+
+    def add_default_sliver_attribute(self, name, value, network=None):
+        if network:
+            defaults = self.xpath("//network[@name='%s']/sliver_defaults" % network)
+        else:
+            defaults = self.xpath("//sliver_defaults" % network)
+        if not defaults:
+            network_tag = self.xpath("//network[@name='%s']" % network)
+            if isinstance(network_tag, list):
+                network_tag = network_tag[0]
+            defaults = self.add_element('sliver_defaults', attrs={}, parent=network_tag)
+        elif isinstance(defaults, list):
+            defaults = defaults[0]
+        self.add_attribute(defaults, name, value)
+
+    def add_sliver_attribute(self, hostname, name, value, network=None):
+        node = self.get_node_elements(network, hostname)
+        sliver = node.find("sliver")
+        self.add_attribute(sliver, name, value)
+    
+    def remove_default_sliver_attribute(self, name, value, network=None):
+        if network:
+            defaults = self.xpath("//network[@name='%s']/sliver_defaults" % network)
+        else:
+            defaults = self.xpath("//sliver_defaults" % network)
+        self.remove_attribute(defaults, name, value)
+    
+    def remove_sliver_attribute(self, hostname, name, value, network=None):
+        node = self.get_node_elements(network, hostname)
+        sliver = node.find("sliver")
+        self.remove_attribute(sliver, name, value)    
+            
+    
+if __name__ == '__main__':
+    import sys
+    from lxml import etree
+    args = sys.argv[1:]
+    filename = args[0]
+
+    root_node = etree.parse(filename)
+    network = SFAv1Node(root_node)
+    print network.get_nodes()