add planetlab schema to scheamaLocation
[sfa.git] / sfa / rspecs / elements / SFAv1Sliver.py
1 #!/usr/bin/python
2
3 from sfa.rspecs.elements.sliver import Sliver
4 from sfa.rspecs.elements.SFAv1Node import SFVv1Node
5
6 class SFAv1Sliver(Sliver):
7
8     def get_sliver_elements(self, network=None):
9         if network:
10             slivers = self.root_node.xpath('//network[@name="%s"]//node/sliver' % network)
11         else:
12             slivers = self.root_node.xpath('//node/sliver')
13         return slivers
14
15     def get_slivers(self, network=None):
16         sliver_elems = self.get_sliver_elements(network)
17         slivers = [self.get_attributes(sliver_elem, recursive=True) \
18                  for sliver_elem in sliver_elems]
19         return slivers
20
21     def add_slivers(self, slivers, network=None):
22         if not isinstance(slivers, list):
23             slivers = [slivers]
24         nodes = SfaV1Node(self.root_node) 
25         for sliver in slivers:
26             if isinstance(sliver, basestring):
27                 sliver = {'hostname': sliver}
28             if 'hostname' in sliver:
29                 node_elem = nodes.get_node_elements(hostnames=sliver['hostname'])
30                 if node_elem:
31                     node_elem[0]
32                 sliver_elem = self.add_element('sliver', parent=node_elem)
33                 if 'tags' in sliver:
34                     for tag in sliver['tags']:
35                         self.add_element(tag['tagname'], parent=sliver_elem, text=tag['value'])
36
37     def remove_slivers(self, slivers, network=node):
38         nodes = SfaV1Node(self.root_node) 
39         for sliver in slivers:
40             if isinstance(sliver, str):
41                 hostname = sliver
42             else:
43                 hostname = sliver['hostname']
44             node_elem = nodes.get_node_elements(network=network, hostnames=hostname)
45             sliver_elem = node_elem.find('sliver')
46             if sliver_elem != None:
47                 node_elem.remove(sliver_elem)    
48                          
49                 
50     def get_sliver_defaults(self, network=None):
51         if network:
52             defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network)     
53         else:
54             defaults = self.xml.xpath("//network/sliver_defaults" % network)
55         return self.attributes_list(defaults)
56
57     def add_default_sliver_attribute(self, name, value, network=None):
58         if network:
59             defaults = self.xpath("//network[@name='%s']/sliver_defaults" % network)
60         else:
61             defaults = self.xpath("//sliver_defaults" % network)
62         if not defaults:
63             network_tag = self.xpath("//network[@name='%s']" % network)
64             if isinstance(network_tag, list):
65                 network_tag = network_tag[0]
66             defaults = self.add_element('sliver_defaults', attrs={}, parent=network_tag)
67         elif isinstance(defaults, list):
68             defaults = defaults[0]
69         self.add_attribute(defaults, name, value)
70
71     def add_sliver_attribute(self, hostname, name, value, network=None):
72         node = self.get_node_elements(network, hostname)
73         sliver = node.find("sliver")
74         self.add_attribute(sliver, name, value)
75     
76     def remove_default_sliver_attribute(self, name, value, network=None):
77         if network:
78             defaults = self.xpath("//network[@name='%s']/sliver_defaults" % network)
79         else:
80             defaults = self.xpath("//sliver_defaults" % network)
81         self.remove_attribute(defaults, name, value)
82     
83     def remove_sliver_attribute(self, hostname, name, value, network=None):
84         node = self.get_node_elements(network, hostname)
85         sliver = node.find("sliver")
86         self.remove_attribute(sliver, name, value)    
87             
88     
89 if __name__ == '__main__':
90     import sys
91     from lxml import etree
92     args = sys.argv[1:]
93     filename = args[0]
94
95     root_node = etree.parse(filename)
96     network = SFAv1Node(root_node)
97     print network.get_nodes()