pagkage /etc/sfa/api_versions.xml
[sfa.git] / sfa / rspecs / elements / versions / pgv2Node.py
1 from sfa.util.xrn import Xrn
2 from sfa.util.xml import XpathFilter
3
4 from sfa.rspecs.elements.node import NodeElement
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     
15
16 from sfa.planetlab.plxrn import xrn_to_hostname
17
18 class PGv2Node:
19     @staticmethod
20     def add_nodes(xml, nodes):
21         node_elems = []
22         for node in 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)
26             # set component name
27             if node.get('component_id'):
28                 component_name = xrn_to_hostname(node['component_id'])
29                 node_elem.set('component_name', component_name)
30             # set hardware types
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)
34             # set location
35             if node.get('location'):
36                 node_elem.add_instance('location', node['location'], Location.fields)       
37             # set interfaces
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('available'):
44                 available_elem = node_elem.add_element('available', now=node['available'])
45             # add services
46             PGv2Services.add_services(node_elem, node.get('services', [])) 
47             # add slivers
48             slivers = node.get('slivers', [])
49             if not slivers:
50                 # we must still advertise the available sliver types
51                 slivers = Sliver({'type': 'plab-vserver'})
52                 # we must also advertise the available initscripts
53                 slivers['tags'] = []
54                 if node.get('pl_initscripts'): 
55                     for initscript in node.get('pl_initscripts', []):
56                         slivers['tags'].append({'name': 'initscript', 'value': initscript['name']})
57             PGv2SliverType.add_slivers(node_elem, slivers)
58         
59         return node_elems
60
61     @staticmethod
62     def get_nodes(xml, filter={}):
63         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
64         node_elems = xml.xpath(xpath)
65         return PGv2Node.get_node_objs(node_elems)
66
67     @staticmethod
68     def get_nodes_with_slivers(xml, filter={}):
69         xpath = '//node[count(sliver_type)>0] | //default:node[count(default:sliver_type) > 0]' 
70         node_elems = xml.xpath(xpath)        
71         return PGv2Node.get_node_objs(node_elems)
72
73     @staticmethod
74     def get_node_objs(node_elems):
75         nodes = []
76         for node_elem in node_elems:
77             node = NodeElement(node_elem.attrib, node_elem)
78             nodes.append(node) 
79             if 'component_id' in node_elem.attrib:
80                 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
81             
82             # get hardware types
83             hardware_type_elems = node_elem.xpath('./default:hardware_type | ./hardware_type')
84             node['hardware_types'] = [hw_type.get_instance(HardwareType) for hw_type in hardware_type_elems]
85             
86             # get location
87             location_elems = node_elem.xpath('./default:location | ./location')
88             locations = [location_elem.get_instance(Location) for location_elem in location_elems]
89             if len(locations) > 0:
90                 node['location'] = locations[0]
91
92             # get interfaces
93             iface_elems = node_elem.xpath('./default:interface | ./interface')
94             node['interfaces'] = [iface_elem.get_instance(Interface) for iface_elem in iface_elems]
95
96             # get services
97             node['services'] = PGv2Services.get_services(node_elem)
98             
99             # get slivers
100             node['slivers'] = PGv2SliverType.get_slivers(node_elem)    
101             available_elems = node_elem.xpath('./default:available | ./available')
102             if len(available_elems) > 0 and 'name' in available_elems[0].attrib:
103                 if available_elems[0].attrib.get('now', '').lower() == 'true': 
104                     node['boot_state'] = 'boot'
105                 else: 
106                     node['boot_state'] = 'disabled' 
107         return nodes
108
109
110     @staticmethod
111     def add_slivers(xml, slivers):
112         component_ids = []
113         for sliver in slivers:
114             filter = {}
115             if isinstance(sliver, str):
116                 filter['component_id'] = '*%s*' % sliver
117                 sliver = {}
118             elif 'component_id' in sliver and sliver['component_id']:
119                 filter['component_id'] = '*%s*' % sliver['component_id']
120             if not filter: 
121                 continue
122             nodes = PGv2Node.get_nodes(xml, filter)
123             if not nodes:
124                 continue
125             node = nodes[0]
126             PGv2SliverType.add_slivers(node, sliver)
127
128     @staticmethod
129     def remove_slivers(xml, hostnames):
130         for hostname in hostnames:
131             nodes = PGv2Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
132             for node in nodes:
133                 slivers = PGv2SliverType.get_slivers(node.element)
134                 for sliver in slivers:
135                     node.element.remove(sliver.element) 
136 if __name__ == '__main__':
137     from sfa.rspecs.rspec import RSpec
138     import pdb
139     r = RSpec('/tmp/emulab.rspec')
140     r2 = RSpec(version = 'ProtoGENI')
141     nodes = PGv2Node.get_nodes(r.xml)
142     PGv2Node.add_nodes(r2.xml.root, nodes)
143     #pdb.set_trace()
144         
145