rename TestQemu into TestQemuBox
[tests.git] / system / TestResources.py
1 # Thierry Parmentelat <thierry.parmentelat@inria.fr>
2 # Copyright (C) 2010 INRIA 
3 #
4 import sys
5 import traceback
6
7 import utils
8 from TestMapper import TestMapper
9 from TestPool import TestPoolQemu, TestPoolIP
10 from Trackers import TrackerPlc, TrackerQemu
11
12 class TestResources:
13
14     # need more specialization, see an example in LocalTestResources.sample.inria
15
16     ########## 
17     def localize (self,plcs,options):
18         try:
19             plcs = self.localize_qemus(plcs,options)
20         except Exception, e:
21             print '* Could not localize qemus','--',e,'--','exiting'
22             traceback.print_exc()
23             sys.exit(1)
24         try:
25             plcs = self.localize_nodes(plcs,options)
26         except Exception,e:
27             print '* Could not localize nodes','--',e,'--','exiting'
28             sys.exit(1)
29         try:
30             plcs = self.localize_plcs(plcs,options)
31         except Exception,e:
32             print '* Could not localize plcs','--',e,'--','exiting'
33             sys.exit(1)
34         try:
35             plcs = self.localize_rspec(plcs,options)
36         except Exception,e:
37             print '* Could not localize RSpec','--',e,'--','exiting'
38             sys.exit(1)
39         return plcs
40
41     def localize_qemus (self,plcs,options):
42
43         # all plcs on the same vserver box
44         plc_box = self.plc_boxes()[0]
45
46         # informative
47         label=options.personality.replace("linux","")
48
49         node_map = []
50         qemu_pool = TestPoolQemu (self.qemus_ip_pool(), options)
51
52         for index in range(1,options.size+1):
53             if options.ips_qemu:
54                 ip_or_hostname=options.ips_qemu.pop()
55                 (hostname,ip,unused)=qemu_pool.locate_entry(ip_or_hostname)
56             else:
57                 tracker=TrackerQemu(options,instances=self.max_qemus()-1)
58                 (hostname,ip,unused) = qemu_pool.next_free(tracker.hostnames())
59
60             node_map += [ ('node%d'%index, {'host_box':hostname},) ]
61
62         mapper = {'plc': [ ('*' , {'hostname':plc_box,
63                                    'PLC_DB_HOST':plc_box,
64                                    'PLC_API_HOST':plc_box,
65                                    'PLC_BOOT_HOST':plc_box,
66                                    'PLC_WWW_HOST':plc_box,
67                                    'name':'%s-'+label } ) 
68                            ],
69                   'node': node_map,
70                   }
71     
72         return TestMapper(plcs,options).map(mapper)
73         
74
75     def localize_nodes (self, plcs, options):
76         
77         ip_pool = TestPoolIP (self.nodes_ip_pool(),options)
78         network_dict = self.network_dict()
79
80         test_mapper = TestMapper (plcs, options)
81     
82         all_nodenames = test_mapper.node_names()
83         maps = []
84         for nodename in all_nodenames:
85             if options.ips_node:
86                 ip_or_hostname=options.ips_node.pop()
87                 (hostname,ip,mac)=ip_pool.locate_entry(ip_or_hostname)
88             else:
89                 tracker=TrackerQemu(options,instances=self.max_qemus()-1)
90                 (hostname,ip,mac) = ip_pool.next_free(tracker.nodenames())
91             utils.header('Attaching node %s to %s (%s)'%(nodename,hostname,ip))
92             node_dict= {'node_fields:hostname':hostname,
93                         'interface_fields:ip':ip, 
94                         'interface_fields:mac':mac,
95                         }
96         
97             node_dict.update(network_dict)
98             maps.append ( ( nodename, node_dict) )
99     
100         plc_map = [ ( '*' , { 'PLC_NET_DNS1' : network_dict [ 'interface_fields:dns1' ],
101                               'PLC_NET_DNS2' : network_dict [ 'interface_fields:dns2' ], } ) ]
102     
103         return test_mapper.map ({'node': maps, 'plc' : plc_map } )
104         
105
106     def localize_plcs (self,plcs,options):
107         
108         ip_pool = TestPoolIP (self.plcs_ip_pool(),options)
109     
110         plc_counter=0
111         for plc in plcs:
112             if options.ips_plc :
113                 ip_or_hostname=options.ips_plc.pop()
114                 (hostname,ip,mac)=ip_pool.locate_entry(ip_or_hostname)
115                 if options.verbose:
116                     utils.header("Using user-provided %s %s for plc %s"%(
117                             hostname,ip_or_hostname,plc['name']))
118             else:
119                 tracker = TrackerPlc(options,instances=self.max_plcs())
120                 (hostname,ip,mac)=ip_pool.next_free(tracker.plcnames())
121                 if options.verbose:
122                     utils.header("Using auto-allocated %s %s for plc %s"%(
123                             hostname,ip,plc['name']))
124     
125             ### rewrite fields in plc
126             # compute a helpful vserver name - remove domain in hostname
127             simplehostname = hostname.split('.')[0]
128             preferred_hostname = self.preferred_hostname()
129             vservername = options.buildname
130             if len(plcs) == 1 :
131                 vservername = "%s-%s" % (vservername,simplehostname)
132                 #ugly hack for "vuname: vc_set_vhi_name(): Arg list too long" errors
133                 if len(vservername) > 38 and preferred_hostname is not None:
134                     vservername = "%s-%s" % (options.buildname,preferred_hostname)
135             else:
136                 plc_counter += 1
137                 vservername = "%s-%d-%s" % (vservername,plc_counter,simplehostname)
138                 #ugly hack for "vuname: vc_set_vhi_name(): Arg list too long" errors
139                 if len(vservername) > 38 and preferred_hostname is not None:
140                     vservername = "%s-%d-%s" % (options.buildname,plc_counter,preferred_hostname)
141
142             # apply
143             plc['vservername']=vservername
144             plc['vserverip']=ip
145             plc['name'] = "%s_%s"%(plc['name'],simplehostname)
146             utils.header("Attaching plc %s to vserver %s (%s)"%(
147                     plc['name'],plc['vservername'],plc['vserverip']))
148             for key in [ 'PLC_DB_HOST', 'PLC_API_HOST', 'PLC_WWW_HOST', 'PLC_BOOT_HOST',]:
149                 plc[key] = hostname
150     
151         return plcs
152
153     # as a plc step this should return a boolean
154     def step_pre (self,plc):
155         return self.trqemu_record (plc) and self.trqemu_make_space(plc) \
156            and self.trplc_record (plc) and self.trplc_make_space(plc)
157
158     def step_post (self,plc):
159         return True
160
161     def step_release (self,plc):
162         return self.trqemu_release(plc) and self.trplc_release(plc)
163
164     def step_release_plc (self,plc):
165         return self.trplc_release(plc) 
166
167     def step_release_qemu (self,plc):
168         return self.trqemu_release(plc) 
169
170     def step_list (self,plc):
171         return self.trqemu_list(plc) and self.trplc_list(plc)
172
173     ####################
174     def trplc_record (self,plc):
175         tracker = TrackerPlc(plc.options,instances=self.max_plcs())
176         tracker.record(plc.test_ssh.hostname,plc.vservername)
177         tracker.store()
178         return True
179
180     def trplc_release (self,plc):
181         tracker = TrackerPlc(plc.options,instances=self.max_plcs())
182         tracker.release(plc.test_ssh.hostname,plc.vservername)
183         tracker.store()
184         return True
185
186     def trplc_make_space (self,plc):
187         tracker = TrackerPlc(plc.options,instances=self.max_plcs())
188         tracker.make_space()
189         tracker.store()
190         return True
191
192     def trplc_list (self,plc):
193         TrackerPlc(plc.options,instances=self.max_plcs()).list()
194         return True
195
196     ###
197     def trqemu_record (self,plc):
198         tracker=TrackerQemu(plc.options,instances=self.max_qemus()-1)
199         for site_spec in plc.plc_spec['sites']:
200             for node_spec in site_spec['nodes']:
201                 tracker.record(node_spec['host_box'],plc.options.buildname,node_spec['node_fields']['hostname'])
202         tracker.store()
203         return True
204
205     def trqemu_release (self,plc):
206         tracker=TrackerQemu(plc.options,instances=self.max_qemus()-1)
207         for site_spec in plc.plc_spec['sites']:
208             for node_spec in site_spec['nodes']:
209                 tracker.release(node_spec['host_box'],plc.options.buildname,node_spec['node_fields']['hostname'])
210         tracker.store()
211         return True
212
213     def trqemu_make_space (self,plc):
214         tracker=TrackerQemu(plc.options,instances=self.max_qemus()-1)
215         for site_spec in plc.plc_spec['sites']:
216             for node_spec in site_spec['nodes']:
217                 tracker.make_space()
218         tracker.store()
219         return True
220
221     def trqemu_list (self,plc):
222         TrackerQemu(plc.options,instances=self.max_qemus()-1).list()
223         return True
224
225     ###
226     def localize_rspec (self,plcs,options):
227        
228         utils.header ("Localize SFA Slice RSpec")
229
230         for plc in plcs:
231             for site in plc['sites']:
232                 for node in site['nodes']:
233                     plc['sfa']['sfa_slice_rspec']['part4'] = node['node_fields']['hostname']
234             plc['sfa']['SFA_REGISTRY_HOST'] = plc['PLC_DB_HOST']
235             plc['sfa']['SFA_AGGREGATE_HOST'] = plc['PLC_DB_HOST']
236             plc['sfa']['SFA_SM_HOST'] = plc['PLC_DB_HOST']
237             plc['sfa']['SFA_PLC_DB_HOST'] = plc['PLC_DB_HOST']
238             plc['sfa']['SFA_PLC_URL'] = 'https://' + plc['PLC_API_HOST'] + ':443/PLCAPI/' 
239         
240         return plcs