fix merge problem
[sfa.git] / sfa / rspecs / elements / versions / pgv2Node.py
1
2 from lxml import etree
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
15 from sfa.rspecs.elements.versions.pgv2Service import PGv2Service     
16
17 class PGv2Node:
18     elements = {
19         'node': RSpecElement(RSpecElements.NODE, '//default:node | //node'),
20         'sliver': RSpecElement(RSpecElements.SLIVER, './default:sliver_type | ./sliver_type'),
21         'interface': RSpecElement(RSpecElements.INTERFACE, './default:interface | ./interface'),
22         'location': RSpecElement(RSpecElements.LOCATION, './default:location | ./location'),
23         'hardware_type': RSpecElement(RSpecElements.HARDWARE_TYPE, './default:hardware_type | ./hardware_type'),
24         'available': RSpecElement(RSpecElements.AVAILABLE, './default:available | ./available'),
25     } 
26     
27     @staticmethod
28     def add_nodes(xml, nodes):
29         node_elems = []
30         for node in nodes:
31             node_elem = etree.SubElement(xml, 'node')
32             node_elems.append(node_elem)
33             if node.get('component_manager_id'):
34                 node_elem.set('component_manager_id', node['component_manager_id'])
35             if node.get('component_id'):
36                 node_elem.set('component_id', node['component_id'])
37                 component_name = Xrn(node['component_id']).get_leaf()
38                 node_elem.set('component_nama', component_name)
39             if node.get('client_id'):
40                 node_elem.set('client_id', node['client_id'])
41             if node.get('sliver_id'):
42                 node_elem.set('sliver_id', node['sliver_id'])
43             if node.get('exclusive'):
44                 node_elem.set('exclusive', node['exclusive'])
45             hardware_types = node.get('hardware_type', [])
46             for hardware_type in hardware_types:
47                 hw_type_elem = etree.SubElement(node_elem, 'hardware_type')
48                 if hardware_type.get('name'):
49                     hw_type_elem.set('name', hardware_type['name'])
50             if node.get('boot_state', '').lower() == 'boot':
51                 available_elem = etree.SubElement(node_elem, 'available', now='True')
52             else:
53                 available_elem = etree.SubElement(node_elem, 'available', now='False')
54             
55             if node.get('services'):
56                 PGv2Services.add_services(node_elem, node.get('services'))
57     
58             slivers = node.get('slivers', [])
59             pl_initscripts = node.get('pl_initscripts', {})
60             for sliver in slivers:
61                 sliver_elem = etree.SubElement(node_elem, 'sliver_type')
62                 if sliver.get('name'):
63                     sliver_elem.set('name', sliver['name'])
64                 if sliver.get('client_id'):
65                     sliver_elem.set('client_id', sliver['client_id'])      
66                 for pl_initscript in pl_initscripts.values():
67                     etree.SubElement(sliver_elem, '{%s}initscript' % xml.namespaces['planetlab'], \
68                       name=pl_initscript['name'])
69             location = node.get('location')
70             #only add locaiton if long and lat are not null
71             if location.get('longitute') and location.get('latitude'):
72                 location_elem = etree.SubElement(node_elem, country=location['country'],
73                   latitude=location['latitude'], longitude=location['longiutde'])
74         return node_elems
75
76     @staticmethod
77     def get_nodes(xml):
78         nodes = []
79         node_elems = xml.xpath(PGv2Node.elements['node'].path)
80         for node_elem in node_elems:
81             node = Node(node_elem.attrib, node_elem)
82             nodes.append(node) 
83             if 'component_id' in node_elem.attrib:
84                 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
85
86             # set hardware type
87             node['hardware_types'] = []
88             hardware_type_elems = node_elem.xpath(PGv2Node.elements['hardware_type'].path, xml.namespaces)
89             for hardware_type_elem in hardware_type_elems:
90                 node['hardware_types'].append(HardwareType(hardware_type_elem.attrib, hardware_type_elem))
91             
92             # set location
93             location_elems = node_elem.xpath(PGv2Node.elements['location'].path, xml.namespaces)
94             if len(location_elems) > 0:
95                 node['location'] = Location(location_elems[0].attrib, location_elems[0])
96             
97             # set services
98             services_elems = node_elem.xpath(PGv2Service.elements['services'].path, xml.namespaces)
99             node['services'] = []
100             for services_elem in services_elems:
101                 # services element has no useful info, but the child elements do  
102                 for child in services_elem.iterchildren():
103                     
104             # set interfaces
105             interface_elems = node_elem.xpath(PGv2Node.elements['interface'].path, xml.namespaces)
106             node['interfaces'] = []
107             for interface_elem in interface_elems:
108                 node['interfaces'].append(Interface(interface_elem.attrib, interface_elem))
109
110             # set available
111             available = node_elem.xpath(PGv2Node.elements['available'].path, xml.namespaces)
112             if len(available) > 0:
113                 if available[0].attrib.get('now', '').lower() == 'true': 
114                     node['boot_state'] = 'boot'
115                 else: 
116                     node['boot_state'] = 'disabled' 
117
118             # set the slivers
119             sliver_elems = node_elem.xpath(PGv2Node.elements['sliver'].path, xml.namespaces)
120             node['slivers'] = []
121             for sliver_elem in sliver_elems:
122                 node['slivers'].append(Sliver(sliver_elem.attrib, sliver_elem))            
123
124         return nodes
125
126
127     @staticmethod
128     def add_slivers(xml, slivers):
129         pass
130    
131     @staticmethod
132     def get_nodes_with_slivers(xml):
133         nodes = PGv2Node.get_nodes(xml)
134         nodes_with_slivers = [node for node in nodes if node['slivers']]
135         return nodes_with_slivers 
136
137 if __name__ == '__main__':
138     from sfa.rspecs.rspec import RSpec
139     import pdb
140     r = RSpec('/tmp/emulab.rspec')
141     r2 = RSpec(version = 'ProtoGENI')
142     nodes = PGv2Node.get_nodes(r.xml)
143     PGv2Node.add_nodes(r2.xml.root, nodes)
144     #pdb.set_trace()
145         
146