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
6 from sfa.rspecs.elements.element import Element
7 from sfa.rspecs.elements.node import Node
8 from sfa.rspecs.elements.sliver import Sliver
9 from sfa.rspecs.elements.location import Location
10 from sfa.rspecs.elements.hardware_type import HardwareType
11 from sfa.rspecs.elements.disk_image import DiskImage
12 from sfa.rspecs.elements.interface import Interface
13 from sfa.rspecs.elements.bwlimit import BWlimit
14 from sfa.rspecs.elements.pltag import PLTag
15 from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver
16 from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag
17 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
22 def add_nodes(xml, nodes):
23 network_elems = Element.get_elements(xml, '//network', fields=['name'])
24 if len(network_elems) > 0:
25 network_elem = network_elems[0]
26 elif len(nodes) > 0 and nodes[0].get('component_manager_id'):
27 network_urn = nodes[0]['component_manager_id']
28 network_elems = Element.add_elements(xml, 'network', {'name': Xrn(network_urn).get_hrn()})
29 network_elem = network_elems[0]
33 node_fields = ['component_manager_id', 'component_id', 'boot_state']
34 elems = Element.add_elements(network_elem, 'node', node, node_fields)
36 node_elems.append(node_elem)
38 # determine network hrn
40 if 'component_manager_id' in node and node['component_manager_id']:
41 network_hrn = Xrn(node['component_manager_id']).get_hrn()
43 # set component_name attribute and hostname element
44 if 'component_id' in node and node['component_id']:
45 component_name = xrn_to_hostname(node['component_id'])
46 node_elem.set('component_name', component_name)
47 hostname_tag = node_elem.add_element('hostname')
48 hostname_tag.set_text(component_name)
51 if 'authority_id' in node and node['authority_id']:
52 node_elem.set('site_id', node['authority_id'])
54 location_elems = Element.add_elements(node_elem, 'location',
55 node.get('location', []), Location.fields)
56 interface_elems = Element.add_elements(node_elem, 'interface',
57 node.get('interfaces', []), Interface.fields)
59 #if 'bw_unallocated' in node and node['bw_unallocated']:
60 # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
62 PGv2Services.add_services(node_elem, node.get('services', []))
63 SFAv1PLTag.add_pl_tags(node_elem, node.get('tags', []))
64 SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
67 def add_slivers(xml, slivers):
69 for sliver in slivers:
71 if isinstance(sliver, str):
72 filter['component_id'] = '*%s*' % sliver
74 elif 'component_id' in sliver and sliver['component_id']:
75 filter['component_id'] = '*%s*' % sliver['component_id']
78 nodes = SFAv1Node.get_nodes(xml, filter)
82 SFAv1Sliver.add_slivers(node, sliver)
85 def remove_slivers(xml, hostnames):
86 for hostname in hostnames:
87 nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
89 slivers = SFAv1Slivers.get_slivers(node.element)
90 for sliver in slivers:
91 node.element.remove(sliver.element)
94 def get_nodes(xml, filter={}):
95 xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
96 node_elems = xml.xpath(xpath)
97 return SFAv1Node.get_node_objs(node_elems)
99 # xxx Thierry : an ugly hack to get the tests to pass again
100 # probably this needs to be trashed
101 # the original code returned the <sliver /> tag,
102 # but we prefer the <node> father node instead as it already holds data
103 # initially this was to preserve the nodename...
104 # xxx I don't get the ' | //default:node/default:sliver' ...
106 def get_nodes_with_slivers_thierry(xml):
108 xpath = '//node[count (sliver)>0]'
109 node_elems = xml.xpath(xpath)
110 # we need to check/recompute the node data
115 def get_nodes_with_slivers(xml):
116 xpath = '//node/sliver | //default:node/default:sliver'
117 node_elems = xml.xpath(xpath)
118 return SFAv1Node.get_node_objs(node_elems)
122 def get_node_objs(node_elems):
124 for node_elem in node_elems:
125 node = Node(node_elem.attrib, node_elem)
126 if 'site_id' in node_elem.attrib:
127 node['authority_id'] = node_elem.attrib['site_id']
128 location_objs = Element.get_elements(node_elem, './default:location | ./location', Location)
129 if len(location_objs) > 0:
130 node['location'] = location_objs[0]
131 bwlimit_objs = Element.get_elements(node_elem, './default:bw_limit | ./bw_limit', BWlimit)
132 if len(bwlimit_objs) > 0:
133 node['bwlimit'] = bwlimit_objs[0]
134 node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface)
135 node['services'] = PGv2Services.get_services(node_elem)
136 node['slivers'] = SFAv1Sliver.get_slivers(node_elem)
137 #thierry node['tags'] = SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields.keys())
138 node['tags'] = SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields)