2 from sfa.util.plxrn import PlXrn
3 from sfa.util.xrn import Xrn
4 from sfa.rspecs.elements.element import Element
5 from sfa.rspecs.elements.node import Node
6 from sfa.rspecs.elements.sliver import Sliver
7 from sfa.rspecs.elements.network import Network
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.pgv2Services import PGv2Services
15 from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType
19 def add_nodes(xml, nodes):
22 node_fields = ['component_manager_id', 'component_id', 'client_id', 'sliver_id', 'exclusive']
23 elems = Element.add(xml, 'node', node, node_fields)
25 node_elems.append(node_elem)
27 if node.get('component_id'):
28 component_name = Xrn(node['component_id']).get_leaf()
29 node_elem.set('component_name', component_name)
31 Element.add(node_elem, 'hardware_type', node.get('hardware_types', []), HardwareType.fields.keys())
33 location_elems = Element.add(node_elem, 'location', node.get('location', []), Location.fields)
35 interface_elems = Element.add(node_elem, 'interface', node.get('interfaces', []), Interface.fields)
36 # set available element
37 if node.get('boot_state', '').lower() == 'boot':
38 available_elem = node_elem.add_element('available', now='True')
40 available_elem = node_elem.add_element('available', now='False')
42 PGv2Services.add_services(node_elem, node.get('services', []))
44 slivers = node.get('slivers', [])
46 # we must still advertise the available sliver types
47 slivers = Sliver({'type': 'plab-vserver'})
48 # we must also advertise the available initscripts
50 for initscript in node.get('pl_initscripts', []):
51 slivers['tags'].append({'name': 'initscript', 'value': initscript['name']})
52 PGv2SliverType.add_slivers(node_elem, slivers)
57 def get_nodes(xml, filter={}):
58 xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
59 node_elems = xml.xpath(xpath)
60 return PGv2Node.get_node_objs(node_elems)
63 def get_nodes_with_sliver(xml):
64 xpath = '//node/sliver_type | //default:node/default:sliver_type'
65 node_elems = xml.xpath(xpath)
66 return PGv2Node.get_node_objs(node_elems)
69 def get_nodes_objs(node_elems):
71 for node_elem in node_elems:
72 node = Node(node_elem.attrib, node_elem)
74 if 'component_id' in node_elem.attrib:
75 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
77 node['hardware_types'] = Element.get(node_elem, './default:hardwate_type | ./hardware_type', HardwareType)
78 lolocation_elems = Element.get(node_elem, './default:location | ./location', Location)
79 if len(location_elems) > 0:
80 node['location'] = location_elems[0]
81 node['interfaces'] = Element.get(node_elem, './default:interface | ./interface', Interface)
82 node['services'] = PGv2Services.get_services(node_elem)
83 node['slivers'] = PGv2SliverType.get_slivers(node_elem)
84 available = Element.get(node_element, './default:available | ./available', fields=['now'])
85 if len(available) > 0 and 'name' in available[0].attrib:
86 if available[0].attrib.get('now', '').lower() == 'true':
87 node['boot_state'] = 'boot'
89 node['boot_state'] = 'disabled'
94 def add_slivers(xml, slivers):
96 for sliver in slivers:
98 if isinstance(sliver, str):
99 filter['component_id'] = '*%s*' % sliver
101 elif 'component_id' in sliver and sliver['component_id']:
102 filter['component_id'] = '*%s*' % sliver['component_id']
105 nodes = PGv2Node.get_nodes(xml, filter)
109 PGv2SliverType.add_slivers(node, sliver)
112 def remove_slivers(xml, hostnames):
113 for hostname in hostnames:
114 nodes = PGv2Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
116 slivers = PGv2SliverType.get_slivers(node.element)
117 for sliver in slivers:
118 node.element.remove(sliver.element)
119 if __name__ == '__main__':
120 from sfa.rspecs.rspec import RSpec
122 r = RSpec('/tmp/emulab.rspec')
123 r2 = RSpec(version = 'ProtoGENI')
124 nodes = PGv2Node.get_nodes(r.xml)
125 PGv2Node.add_nodes(r2.xml.root, nodes)