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