1 from sfa.util.plxrn import PlXrn, xrn_to_hostname
2 from sfa.util.xrn import Xrn
3 from sfa.rspecs.elements.element import Element
4 from sfa.rspecs.elements.node import Node
5 from sfa.rspecs.elements.sliver import Sliver
6 from sfa.rspecs.elements.network import Network
7 from sfa.rspecs.elements.location import Location
8 from sfa.rspecs.elements.hardware_type import HardwareType
9 from sfa.rspecs.elements.disk_image import DiskImage
10 from sfa.rspecs.elements.interface import Interface
11 from sfa.rspecs.elements.bwlimit import BWlimit
12 from sfa.rspecs.elements.pltag import PLTag
13 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
14 from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType
18 def add_nodes(xml, nodes):
21 node_fields = ['component_manager_id', 'component_id', 'client_id', 'sliver_id', 'exclusive']
22 elems = Element.add_elements(xml, 'node', node, node_fields)
24 node_elems.append(node_elem)
26 if node.get('component_id'):
27 component_name = xrn_to_hostname(node['component_id'])
28 node_elem.set('component_name', component_name)
30 Element.add_elements(node_elem, 'hardware_type', node.get('hardware_types', []), HardwareType.fields)
32 location_elems = Element.add_elements(node_elem, 'location', node.get('location', []), Location.fields)
34 interface_elems = Element.add_elements(node_elem, 'interface', node.get('interfaces', []), Interface.fields)
35 # set available element
36 if node.get('boot_state', '').lower() == 'boot':
37 available_elem = node_elem.add_element('available', now='True')
39 available_elem = node_elem.add_element('available', now='False')
41 PGv2Services.add_services(node_elem, node.get('services', []))
43 slivers = node.get('slivers', [])
45 # we must still advertise the available sliver types
46 slivers = Sliver({'type': 'plab-vserver'})
47 # we must also advertise the available initscripts
49 for initscript in node.get('pl_initscripts', []):
50 slivers['tags'].append({'name': 'initscript', 'value': initscript['name']})
51 PGv2SliverType.add_slivers(node_elem, slivers)
56 def get_nodes(xml, filter={}):
57 xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
58 node_elems = xml.xpath(xpath)
59 return PGv2Node.get_node_objs(node_elems)
62 def get_nodes_with_sliver(xml, filter={}):
63 xpath = '//node/sliver_type | //default:node/default:sliver_type'
64 node_elems = xml.xpath(xpath)
65 return PGv2Node.get_node_objs(node_elems)
68 def get_nodes_objs(node_elems):
70 for node_elem in node_elems:
71 node = Node(node_elem.attrib, node_elem)
73 if 'component_id' in node_elem.attrib:
74 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
76 node['hardware_types'] = Element.get_elements(node_elem, './default:hardwate_type | ./hardware_type', HardwareType)
77 lolocation_elems = Element.get_elements(node_elem, './default:location | ./location', Location)
78 if len(location_elems) > 0:
79 node['location'] = location_elems[0]
80 node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface)
81 node['services'] = PGv2Services.get_services(node_elem)
82 node['slivers'] = PGv2SliverType.get_slivers(node_elem)
83 available = Element.get_elements(node_element, './default:available | ./available', fields=['now'])
84 if len(available) > 0 and 'name' in available[0].attrib:
85 if available[0].attrib.get('now', '').lower() == 'true':
86 node['boot_state'] = 'boot'
88 node['boot_state'] = 'disabled'
93 def add_slivers(xml, slivers):
95 for sliver in slivers:
97 if isinstance(sliver, str):
98 filter['component_id'] = '*%s*' % sliver
100 elif 'component_id' in sliver and sliver['component_id']:
101 filter['component_id'] = '*%s*' % sliver['component_id']
104 nodes = PGv2Node.get_nodes(xml, filter)
108 PGv2SliverType.add_slivers(node, sliver)
111 def remove_slivers(xml, hostnames):
112 for hostname in hostnames:
113 nodes = PGv2Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
115 slivers = PGv2SliverType.get_slivers(node.element)
116 for sliver in slivers:
117 node.element.remove(sliver.element)
118 if __name__ == '__main__':
119 from sfa.rspecs.rspec import RSpec
121 r = RSpec('/tmp/emulab.rspec')
122 r2 = RSpec(version = 'ProtoGENI')
123 nodes = PGv2Node.get_nodes(r.xml)
124 PGv2Node.add_nodes(r2.xml.root, nodes)