3 from sfa.util.plxrn import PlXrn
4 from sfa.util.xrn import Xrn
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.pl_tag import PLTag
14 from sfa.rspecs.rspec_elements import RSpecElement, RSpecElements
18 'node': RSpecElement(RSpecElements.NODE, '//default:node | //node'),
19 'sliver': RSpecElement(RSpecElements.SLIVER, './default:sliver_type | ./sliver_type'),
20 'interface': RSpecElement(RSpecElements.INTERFACE, './default:interface | ./interface'),
21 'location': RSpecElement(RSpecElements.LOCATION, './default:location | ./location'),
22 'hardware_type': RSpecElement(RSpecElements.HARDWARE_TYPE, './default:hardware_type | ./hardware_type'),
23 'available': RSpecElement(RSpecElements.AVAILABLE, './default:available | ./available'),
27 def add_nodes(xml, nodes):
30 node_elem = etree.SubElement(xml, 'node')
31 node_elems.append(node_elem)
32 if node.get('component_manager_id'):
33 node_elem.set('component_manager_id', node['component_manager_id'])
34 if node.get('component_id'):
35 node_elem.set('component_id', node['component_id'])
36 component_name = Xrn(node['component_id']).get_leaf()
37 node_elem.set('component_nama', component_name)
38 if node.get('client_id'):
39 node_elem.set('client_id', node['client_id'])
40 if node.get('exclusive'):
41 node_elem.set('exclusive', node['exclusive'])
42 hardware_types = node.get('hardware_type', [])
43 for hardware_type in hardware_types:
44 hw_type_elem = etree.SubElement(node_elem, 'hardware_type')
45 if hardware_type.get('name'):
46 hw_type_elem.set('name', hardware_type['name'])
47 if node.get('available') and node['available'].get('now'):
48 available_elem = etree.SubElement(node_elem, 'available', \
49 now=node['available']['now'])
50 slivers = node.get('slivers', [])
51 for sliver in slivers:
52 sliver_elem = etree.SubElement(node_elem, 'sliver_type')
53 if sliver.get('name'):
54 sliver_elem.set('name', sliver['name'])
55 if sliver.get('client_id'):
56 sliver_elem.set('client_id', sliver['client_id'])
57 pl_initscripts = node.get('pl_initscripts', {})
58 for pl_initscript in pl_initscripts.values():
59 etree.SubElement(sliver_elem, '{%s}initscript' % xml.namespaces['planetlab'], \
60 name=pl_initscript['name'])
61 location = node.get('location')
62 #only add locaiton if long and lat are not null
63 if location.get('longitute') and location.get('latitude'):
64 location_elem = etree.SubElement(node_elem, country=location['country'],
65 latitude=location['latitude'], longitude=location['longiutde'])
71 node_elems = xml.xpath(PGv2Node.elements['node'].path)
72 for node_elem in node_elems:
73 node = Node(node_elem.attrib, node_elem)
75 if 'component_id' in node_elem.attrib:
76 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
79 node['hardware_types'] = []
80 hardware_type_elems = node_elem.xpath(PGv2Node.elements['hardware_type'].path, xml.namespaces)
81 for hardware_type_elem in hardware_type_elems:
82 node['hardware_types'].append(HardwareType(hardware_type_elem.attrib, hardware_type_elem))
85 location_elems = node_elem.xpath(PGv2Node.elements['location'].path, xml.namespaces)
86 if len(location_elems) > 0:
87 node['location'] = Location(location_elems[0].attrib, location_elems[0])
90 interface_elems = node_elem.xpath(PGv2Node.elements['interface'].path, xml.namespaces)
91 node['interfaces'] = []
92 for interface_elem in interface_elems:
93 node['interfaces'].append(Interface(interface_elem.attrib, interface_elem))
96 available = node_elem.xpath(PGv2Node.elements['available'].path, xml.namespaces)
97 if len(available) > 0:
98 node['available'] = available[0].attrib
101 sliver_elems = node_elem.xpath(PGv2Node.elements['sliver'].path, xml.namespaces)
103 for sliver_elem in sliver_elems:
104 node['slivers'].append(Sliver(sliver_elem.attrib, sliver_elem))
110 def add_slivers(xml, slivers):
114 def get_nodes_with_slivers(xml):
115 nodes = PGv2Node.get_nodes(xml)
116 nodes_with_slivers = [node for node in nodes if node['slivers']]
117 return nodes_with_slivers
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)