1 from sfa.util.sfalogging import logger
2 from sfa.util.xml import XpathFilter
3 from sfa.util.plxrn import PlXrn, xrn_to_hostname
4 from sfa.util.xrn import Xrn
5 from sfa.rspecs.elements.element import Element
6 from sfa.rspecs.elements.node import Node
7 from sfa.rspecs.elements.sliver import Sliver
8 from sfa.rspecs.elements.location import Location
9 from sfa.rspecs.elements.hardware_type import HardwareType
10 from sfa.rspecs.elements.disk_image import DiskImage
11 from sfa.rspecs.elements.interface import Interface
12 from sfa.rspecs.elements.bwlimit import BWlimit
13 from sfa.rspecs.elements.pltag import PLTag
14 from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver
15 from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag
16 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
21 def add_nodes(xml, nodes):
22 network_elems = Element.get_elements(xml, '//network', fields=['name'])
23 if len(network_elems) > 0:
24 network_elem = network_elems[0]
25 elif len(nodes) > 0 and nodes[0].get('component_manager_id'):
26 network_urn = nodes[0]['component_manager_id']
27 network_elems = Element.add_elements(xml, 'network', {'name': Xrn(network_urn).get_hrn()})
28 network_elem = network_elems[0]
32 node_fields = ['component_manager_id', 'component_id', 'boot_state']
33 elems = Element.add_elements(network_elem, 'node', node, node_fields)
35 node_elems.append(node_elem)
37 # determine network hrn
39 if 'component_manager_id' in node and node['component_manager_id']:
40 network_hrn = Xrn(node['component_manager_id']).get_hrn()
42 # set component_name attribute and hostname element
43 if 'component_id' in node and node['component_id']:
44 component_name = xrn_to_hostname(node['component_id'])
45 node_elem.set('component_name', component_name)
46 hostname_tag = node_elem.add_element('hostname')
47 hostname_tag.set_text(component_name)
50 if 'authority_id' in node and node['authority_id']:
51 node_elem.set('site_id', node['authority_id'])
53 location_elems = Element.add_elements(node_elem, 'location',
54 node.get('location', []), Location.fields)
55 interface_elems = Element.add_elements(node_elem, 'interface',
56 node.get('interfaces', []), ['component_id', 'client_id', 'ipv4'])
58 #if 'bw_unallocated' in node and node['bw_unallocated']:
59 # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
61 PGv2Services.add_services(node_elem, node.get('services', []))
62 SFAv1PLTag.add_pl_tags(node_elem, node.get('tags', []))
63 SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
66 def add_slivers(xml, slivers):
68 for sliver in slivers:
70 if isinstance(sliver, str):
71 filter['component_id'] = '*%s*' % sliver
73 elif 'component_id' in sliver and sliver['component_id']:
74 filter['component_id'] = '*%s*' % sliver['component_id']
77 nodes = SFAv1Node.get_nodes(xml, filter)
81 SFAv1Sliver.add_slivers(node, sliver)
84 def remove_slivers(xml, hostnames):
85 for hostname in hostnames:
86 nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
88 slivers = SFAv1Slivers.get_slivers(node.element)
89 for sliver in slivers:
90 node.element.remove(sliver.element)
93 def get_nodes(xml, filter={}):
94 xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
95 node_elems = xml.xpath(xpath)
96 return SFAv1Node.get_node_objs(node_elems)
98 # xxx Thierry : an ugly hack to get the tests to pass again
99 # probably this needs to be trashed
100 # the original code returned the <sliver /> tag,
101 # but we prefer the <node> father node instead as it already holds data
102 # initially this was to preserve the nodename...
103 # xxx I don't get the ' | //default:node/default:sliver' ...
105 def get_nodes_with_slivers_thierry(xml):
107 xpath = '//node[count (sliver)>0]'
108 node_elems = xml.xpath(xpath)
109 # we need to check/recompute the node data
114 def get_nodes_with_slivers(xml):
115 xpath = '//node/sliver | //default:node/default:sliver'
116 node_elems = xml.xpath(xpath)
117 return SFAv1Node.get_node_objs(node_elems)
121 def get_node_objs(node_elems):
123 for node_elem in node_elems:
124 node = Node(node_elem.attrib, node_elem)
125 if 'site_id' in node_elem.attrib:
126 node['authority_id'] = node_elem.attrib['site_id']
127 location_objs = Element.get_elements(node_elem, './default:location | ./location', Location)
128 if len(location_objs) > 0:
129 node['location'] = location_objs[0]
130 bwlimit_objs = Element.get_elements(node_elem, './default:bw_limit | ./bw_limit', BWlimit)
131 if len(bwlimit_objs) > 0:
132 node['bwlimit'] = bwlimit_objs[0]
133 node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface)
134 node['services'] = PGv2Services.get_services(node_elem)
135 node['slivers'] = SFAv1Sliver.get_slivers(node_elem)
136 #thierry node['tags'] = SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields.keys())
137 node['tags'] = SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields)