3 from sfa.rspecs.elements.node import Node
7 def get_node_elements(self, network=None, hostnames=None):
9 query = '//network[@name="%s"]//node' % network
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))
19 return self.xpath(query)
21 def get_nodes(self, network=None, hostnames=None):
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]
27 def add_nodes(self, nodes, network=None, no_dupes=False):
28 if not isinstance(nodes, list):
32 self.get_node_element(node['hostname']):
36 network_tag = self.root_node
38 network = node['network']
39 network_tags = self.root_node.xpath('//network[@name="%s"]' % network)
41 #network_tag = etree.SubElement(self.root_node, 'network', name=network)
42 network_tag = self.add_element('network', {'name': network}, self.root_node)
44 network_tag = network_tags[0]
46 #node_tag = etree.SubElement(network_tag, 'node')
47 node_tag = self.add_element('node', parent=network_tag)
49 node_tag.set('component_manager_id', network)
51 node_tag.set('component_id', node['urn'])
52 if 'site_urn' in node:
53 node_tag.set('site_id', node['site_urn'])
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)
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']
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)
82 if __name__ == '__main__':
84 from lxml import etree
88 root_node = etree.parse(filename)
89 network = SFAv1Node(root_node)
90 print network.get_nodes()