1 from sfa.util.sfalogging import logger
2 from sfa.util.xml import XpathFilter
3 from sfa.util.xrn import Xrn, get_leaf
5 from sfa.rspecs.elements.element import Element
6 from sfa.rspecs.elements.node import NodeElement
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
22 def add_nodes(xml, nodes):
23 network_elems = xml.xpath('//network')
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_elem = xml.add_element('network', name = Xrn(network_urn).get_hrn())
34 node_fields = ['component_manager_id', 'component_id', 'boot_state']
35 node_elem = network_elem.add_instance('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.unescape(get_leaf(Xrn(node['component_id']).get_hrn()))
46 node_elem.set('component_name', component_name)
47 hostname_elem = node_elem.add_element('hostname')
48 hostname_elem.set_text(component_name)
51 if 'authority_id' in node and node['authority_id']:
52 node_elem.set('site_id', node['authority_id'])
55 location = node.get('location')
57 node_elem.add_instance('location', location, Location.fields)
59 # add exclusive tag to distinguish between Reservable and Shared nodes
60 exclusive_elem = node_elem.add_element('exclusive')
61 if node.get('exclusive') and node.get('exclusive') == 'true':
62 exclusive_elem.set_text('TRUE')
63 # add granularity of the reservation system
64 granularity = node.get('granularity')
66 node_elem.add_instance('granularity', granularity, granularity.fields)
68 exclusive_elem.set_text('FALSE')
71 if isinstance(node.get('interfaces'), list):
72 for interface in node.get('interfaces', []):
73 node_elem.add_instance('interface', interface, ['component_id', 'client_id', 'ipv4'])
75 #if 'bw_unallocated' in node and node['bw_unallocated']:
76 # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
78 PGv2Services.add_services(node_elem, node.get('services', []))
79 tags = node.get('tags', [])
82 # backdoor for FITeagle
83 # Alexander Willner <alexander.willner@tu-berlin.de>
84 if tag['tagname']=="fiteagle_settings":
85 tag_elem = node_elem.add_element(tag['tagname'])
86 for subtag in tag['value']:
87 subtag_elem = tag_elem.add_element('setting')
88 subtag_elem.set('name', str(subtag['tagname']))
89 subtag_elem.set('description', str(subtag['description']))
90 subtag_elem.set_text(subtag['value'])
92 tag_elem = node_elem.add_element(tag['tagname'])
93 tag_elem.set_text(tag['value'])
94 SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
97 def add_slivers(xml, slivers):
99 for sliver in slivers:
101 if isinstance(sliver, str):
102 filter['component_id'] = '*%s*' % sliver
104 elif 'component_id' in sliver and sliver['component_id']:
105 filter['component_id'] = '*%s*' % sliver['component_id']
108 nodes = SFAv1Node.get_nodes(xml, filter)
112 SFAv1Sliver.add_slivers(node, sliver)
115 def remove_slivers(xml, hostnames):
116 for hostname in hostnames:
117 nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
119 slivers = SFAv1Sliver.get_slivers(node.element)
120 for sliver in slivers:
121 node.element.remove(sliver.element)
124 def get_nodes(xml, filter={}):
125 xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
126 node_elems = xml.xpath(xpath)
127 return SFAv1Node.get_node_objs(node_elems)
130 def get_nodes_with_slivers(xml):
131 xpath = '//node[count(sliver)>0] | //default:node[count(default:sliver)>0]'
132 node_elems = xml.xpath(xpath)
133 return SFAv1Node.get_node_objs(node_elems)
137 def get_node_objs(node_elems):
139 for node_elem in node_elems:
140 node = NodeElement(node_elem.attrib, node_elem)
141 if 'site_id' in node_elem.attrib:
142 node['authority_id'] = node_elem.attrib['site_id']
144 location_elems = node_elem.xpath('./default:location | ./location')
145 locations = [dict(loc_elem.get_instance(Location)) for loc_elem in location_elems]
146 if len(locations) > 0:
147 node['location'] = locations[0]
149 bwlimit_elems = node_elem.xpath('./default:bw_limit | ./bw_limit')
150 bwlimits = [bwlimit_elem.get_instance(BWlimit) for bwlimit_elem in bwlimit_elems]
151 if len(bwlimits) > 0:
152 node['bwlimit'] = bwlimits[0]
154 iface_elems = node_elem.xpath('./default:interface | ./interface')
155 ifaces = [dict(iface_elem.get_instance(Interface)) for iface_elem in iface_elems]
156 node['interfaces'] = ifaces
158 node['services'] = PGv2Services.get_services(node_elem)
160 node['slivers'] = SFAv1Sliver.get_slivers(node_elem)
162 node['tags'] = SFAv1PLTag.get_pl_tags(node_elem, ignore=NodeElement.fields+["hardware_type"])
164 hardware_type_elems = node_elem.xpath('./default:hardware_type | ./hardware_type')
165 node['hardware_types'] = [dict(hw_type.get_instance(HardwareType)) for hw_type in hardware_type_elems]
167 # temporary... play nice with old slice manager rspec
168 if not node['component_name']:
169 hostname_elem = node_elem.find("hostname")
170 if hostname_elem != None:
171 node['component_name'] = hostname_elem.text