1 # Thierry Parmentelat <thierry.parmentelat@inria.fr>
2 # Copyright (C) 2010 INRIA
8 from TestMapper import TestMapper
9 from TestPool import TestPoolQemu, TestPoolIP
10 from Trackers import TrackerPlc, TrackerQemu
14 # need more specialization, see an example in OnelabTestResources
17 def localize (self,plcs,options):
19 plcs = self.localize_qemus(plcs,options)
21 print '* Could not localize qemus','--',e,'--','exiting'
25 plcs = self.localize_nodes(plcs,options)
27 print '* Could not localize nodes','--',e,'--','exiting'
30 plcs = self.localize_plcs(plcs,options)
32 print '* Could not localize plcs','--',e,'--','exiting'
35 plcs = self.localize_rspec(plcs,options)
37 print '* Could not localize RSpec','--',e,'--','exiting'
41 def localize_qemus (self,plcs,options):
43 # all plcs on the same vserver box
44 plc_box = self.plc_boxes()[0]
47 label=options.personality.replace("linux","")
50 qemu_pool = TestPoolQemu (self.qemus_ip_pool(), options)
52 for index in range(1,options.size+1):
54 ip_or_hostname=options.ips_qemu.pop()
55 (hostname,ip,unused)=qemu_pool.locate_entry(ip_or_hostname)
57 tracker=TrackerQemu(options,instances=self.max_qemus()-1)
58 (hostname,ip,unused) = qemu_pool.next_free(tracker.hostnames())
60 node_map += [ ('node%d'%index, {'host_box':hostname},) ]
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 } )
72 return TestMapper(plcs,options).map(mapper)
75 def localize_nodes (self, plcs, options):
77 ip_pool = TestPoolIP (self.nodes_ip_pool(),options)
78 network_dict = self.network_dict()
80 test_mapper = TestMapper (plcs, options)
82 all_nodenames = test_mapper.node_names()
84 for nodename in all_nodenames:
86 ip_or_hostname=options.ips_node.pop()
87 (hostname,ip,mac)=ip_pool.locate_entry(ip_or_hostname)
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,
97 node_dict.update(network_dict)
98 maps.append ( ( nodename, node_dict) )
100 plc_map = [ ( '*' , { 'PLC_NET_DNS1' : network_dict [ 'interface_fields:dns1' ],
101 'PLC_NET_DNS2' : network_dict [ 'interface_fields:dns2' ], } ) ]
103 return test_mapper.map ({'node': maps, 'plc' : plc_map } )
106 def localize_plcs (self,plcs,options):
108 ip_pool = TestPoolIP (self.plcs_ip_pool(),options)
113 ip_or_hostname=options.ips_plc.pop()
114 (hostname,ip,mac)=ip_pool.locate_entry(ip_or_hostname)
116 utils.header("Using user-provided %s %s for plc %s"%(
117 hostname,ip_or_hostname,plc['name']))
119 tracker = TrackerPlc(options,instances=self.max_plcs())
120 (hostname,ip,mac)=ip_pool.next_free(tracker.plcnames())
122 utils.header("Using auto-allocated %s %s for plc %s"%(
123 hostname,ip,plc['name']))
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
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)
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)
143 plc['vservername']=vservername
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',]:
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)
158 def step_post (self,plc):
161 def step_release (self,plc):
162 return self.trqemu_release(plc) and self.trplc_release(plc)
164 def step_release_plc (self,plc):
165 return self.trplc_release(plc)
167 def step_release_qemu (self,plc):
168 return self.trqemu_release(plc)
170 def step_list (self,plc):
171 return self.trqemu_list(plc) and self.trplc_list(plc)
174 def trplc_record (self,plc):
175 tracker = TrackerPlc(plc.options,instances=self.max_plcs())
176 tracker.record(plc.test_ssh.hostname,plc.vservername)
180 def trplc_release (self,plc):
181 tracker = TrackerPlc(plc.options,instances=self.max_plcs())
182 tracker.release(plc.test_ssh.hostname,plc.vservername)
186 def trplc_make_space (self,plc):
187 tracker = TrackerPlc(plc.options,instances=self.max_plcs())
192 def trplc_list (self,plc):
193 TrackerPlc(plc.options,instances=self.max_plcs()).list()
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'])
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'])
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']:
221 def trqemu_list (self,plc):
222 TrackerQemu(plc.options,instances=self.max_qemus()-1).list()
226 def localize_rspec (self,plcs,options):
228 utils.header ("Localize SFA Slice RSpec")
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/'