1 from sfa.util.xrn import Xrn
2 from sfa.util.xml import XpathFilter
4 from sfa.rspecs.elements.node import Node
5 from sfa.rspecs.elements.sliver import Sliver
6 from sfa.rspecs.elements.location import Location
7 from sfa.rspecs.elements.hardware_type import HardwareType
8 from sfa.rspecs.elements.disk_image import DiskImage
9 from sfa.rspecs.elements.interface import Interface
10 from sfa.rspecs.elements.bwlimit import BWlimit
11 from sfa.rspecs.elements.pltag import PLTag
12 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
13 from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType
14 from sfa.rspecs.elements.versions.pgv2Interface import PGv2Interface
16 from sfa.planetlab.plxrn import xrn_to_hostname
20 def add_nodes(xml, nodes):
23 node_fields = ['component_manager_id', 'component_id', 'client_id', 'sliver_id', 'exclusive']
24 node_elem = xml.add_instance('node', node, node_fields)
25 node_elems.append(node_elem)
27 if node.get('component_id'):
28 component_name = xrn_to_hostname(node['component_id'])
29 node_elem.set('component_name', component_name)
31 if node.get('hardware_types'):
32 for hardware_type in node.get('hardware_types', []):
33 node_elem.add_instance('hardware_type', hardware_type, HardwareType.fields)
35 if node.get('location'):
36 node_elem.add_instance('location', node['location'], Location.fields)
38 PGv2Interface.add_interfaces(node_elem, node.get('interfaces'))
39 #if node.get('interfaces'):
40 # for interface in node.get('interfaces', []):
41 # node_elem.add_instance('interface', interface, ['component_id', 'client_id'])
42 # set available element
43 if node.get('boot_state'):
44 if node.get('boot_state').lower() == 'boot':
45 available_elem = node_elem.add_element('available', now='true')
47 available_elem = node_elem.add_element('available', now='false')
49 PGv2Services.add_services(node_elem, node.get('services', []))
51 slivers = node.get('slivers', [])
53 # we must still advertise the available sliver types
54 slivers = Sliver({'type': 'plab-vserver'})
55 # we must also advertise the available initscripts
57 if node.get('pl_initscripts'):
58 for initscript in node.get('pl_initscripts', []):
59 slivers['tags'].append({'name': 'initscript', 'value': initscript['name']})
60 PGv2SliverType.add_slivers(node_elem, slivers)
65 def get_nodes(xml, filter={}):
66 xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
67 node_elems = xml.xpath(xpath)
68 return PGv2Node.get_node_objs(node_elems)
71 def get_nodes_with_slivers(xml, filter={}):
72 xpath = '//node[count(sliver_type)>0] | //default:node[count(default:sliver_type) > 0]'
73 node_elems = xml.xpath(xpath)
74 return PGv2Node.get_node_objs(node_elems)
77 def get_node_objs(node_elems):
79 for node_elem in node_elems:
80 node = Node(node_elem.attrib, node_elem)
82 if 'component_id' in node_elem.attrib:
83 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
86 hardware_type_elems = node_elem.xpath('./default:hardware_type | ./hardware_type')
87 node['hardware_types'] = [hw_type.get_instance(HardwareType) for hw_type in hardware_type_elems]
90 location_elems = node_elem.xpath('./default:location | ./location')
91 locations = [location_elem.get_instance(Location) for location_elem in location_elems]
92 if len(locations) > 0:
93 node['location'] = locations[0]
96 iface_elems = node_elem.xpath('./default:interface | ./interface')
97 node['interfaces'] = [iface_elem.get_instance(Interface) for iface_elem in iface_elems]
100 node['services'] = PGv2Services.get_services(node_elem)
103 node['slivers'] = PGv2SliverType.get_slivers(node_elem)
104 available_elems = node_elem.xpath('./default:available | ./available')
105 if len(available_elems) > 0 and 'name' in available_elems[0].attrib:
106 if available_elems[0].attrib.get('now', '').lower() == 'true':
107 node['boot_state'] = 'boot'
109 node['boot_state'] = 'disabled'
114 def add_slivers(xml, slivers):
116 for sliver in slivers:
118 if isinstance(sliver, str):
119 filter['component_id'] = '*%s*' % sliver
121 elif 'component_id' in sliver and sliver['component_id']:
122 filter['component_id'] = '*%s*' % sliver['component_id']
125 nodes = PGv2Node.get_nodes(xml, filter)
129 PGv2SliverType.add_slivers(node, sliver)
132 def remove_slivers(xml, hostnames):
133 for hostname in hostnames:
134 nodes = PGv2Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
136 slivers = PGv2SliverType.get_slivers(node.element)
137 for sliver in slivers:
138 node.element.remove(sliver.element)
139 if __name__ == '__main__':
140 from sfa.rspecs.rspec import RSpec
142 r = RSpec('/tmp/emulab.rspec')
143 r2 = RSpec(version = 'ProtoGENI')
144 nodes = PGv2Node.get_nodes(r.xml)
145 PGv2Node.add_nodes(r2.xml.root, nodes)