added hostname agrument to get_node_elements()
[sfa.git] / sfa / rspecs / elements / SFAv1Node.py
1 #!/usr/bin/python
2
3 from sfa.rspecs.elements.node import Node
4
5 class SFAv1Node(Node):
6
7     def get_node_elements(self, network=None, hostnames=None):
8         if network:
9             query = '//network[@name="%s"]//node' % network
10         else:
11             query = '//node'
12
13         if isinstance(hostnames, str):
14             query = query + '/hostname[text() = "%s"]' % hostnames
15         elif isinstance(hostnames, list):
16             query = query + '/hostname[contains( "%s" , text())]' \
17                     %(" ".join(hostnames))
18             
19         return self.xpath(query)
20
21     def get_nodes(self, network=None, hostnames):
22         node_elems = self.get_node_elements(network, hostnames)
23         nodes = [self.get_attributes(node_elem, recursive=True) \
24                  for node_elem in node_elems]
25         return nodes
26
27     def add_nodes(self, nodes, network=None, no_dupes=False):
28         if not isinstance(nodes, list):
29             nodes = [nodes]
30         for node in nodes:
31             if no_dupes and \
32               self.get_node_element(node['hostname']):
33                 # node already exists
34                 continue
35
36             network_tag = self.root_node
37             if 'network' in node:
38                 network = node['network']
39                 network_tags = self.root_node.xpath('//network[@name="%s"]' % network)
40                 if not network_tags:
41                     #network_tag = etree.SubElement(self.root_node, 'network', name=network)
42                     network_tag = self.add_element('network', {'name': network}, self.root_node)
43                 else:
44                     network_tag = network_tags[0]
45
46             #node_tag = etree.SubElement(network_tag, 'node')
47             node_tag = self.add_element('node', parent=network_tag)
48             if 'network' in node:
49                 node_tag.set('component_manager_id', network)
50             if 'urn' in node:
51                 node_tag.set('component_id', node['urn'])
52             if 'site_urn' in node:
53                 node_tag.set('site_id', node['site_urn'])
54             if 'node_id' in node:
55                 node_tag.set('node_id', 'n'+str(node['node_id']))
56             if 'hostname' in node:
57                 #hostname_tag = etree.SubElement(node_tag, 'hostname').text = node['hostname']
58                 hostname_tag = self.add_element('hostname', parent=node_tag)
59                 hostname_tag.text = node['hostname']
60             if 'interfaces' in node:
61                 for interface in node['interfaces']:
62                     if 'bwlimit' in interface and interface['bwlimit']:
63                         #bwlimit = etree.SubElement(node_tag, 'bw_limit', units='kbps').text = str(interface['bwlimit']/1000)
64                         bwlimit_tag = self.add_element('bw_limit', {'units': 'kbps'}, parent=node_tag)
65                         bwlimit_tag.text = str(interface['bwlimit']/1000)
66             if 'tags' in node:
67                 for tag in node['tags']:
68                    # expose this hard wired list of tags, plus the ones that are marked 'sfa' in their category
69                    if tag['tagname'] in ['fcdistro', 'arch'] or 'sfa' in tag['category'].split('/'):
70                         #tag_element = etree.SubElement(node_tag, tag['tagname'], value=tag['value'])
71                         tag_element = self.add_element(tag['tagname'], parent=node_tag)
72                         tag_element.text = tag['value']
73
74             if 'site' in node:
75                 longitude = str(node['site']['longitude'])
76                 latitude = str(node['site']['latitude'])
77                 #location = etree.SubElement(node_tag, 'location', country='unknown', \
78                 #                            longitude=longitude, latitude=latitude) 
79                 location_attrs = {'country': 'unknown', 'longitude': longitude, 'latitude': latitude} 
80                 self.add_element('location', location_attrs, node_tag) 
81
82 if __name__ == '__main__':
83     import sys
84     from lxml import etree
85     args = sys.argv[1:]
86     filename = args[0]
87
88     root_node = etree.parse(filename)
89     network = SFAv1Node(root_node)
90     print network.get_nodes()