X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=system%2FTestPlc.py;h=812b867c7bd7ff25609f9c3fb0abc986eaa8c349;hb=2719a3bce23e7635454b2fab9e62d7062666bb07;hp=d61212de9e0cfaa6a90e8ff056306fbc1f9f95ce;hpb=c2ac4f63e172f341c049ebb198715c3a416b83d2;p=tests.git diff --git a/system/TestPlc.py b/system/TestPlc.py index d61212d..812b867 100644 --- a/system/TestPlc.py +++ b/system/TestPlc.py @@ -1,4 +1,6 @@ -# $Id$ +# Thierry Parmentelat +# Copyright (C) 2010 INRIA +# import os, os.path import datetime import time @@ -80,6 +82,7 @@ def slice_mapper_options_sfa (method): return actual SEP='' +SEPSFA='' class TestPlc: @@ -87,38 +90,37 @@ class TestPlc: 'display', 'resources_pre', SEP, 'delete_vs','create_vs','install', 'configure', 'start', SEP, 'fetch_keys', 'store_keys', 'clear_known_hosts', SEP, - 'initscripts', 'sites', 'nodes', 'slices', 'nodegroups', SEP, + 'initscripts', 'sites', 'nodes', 'slices', 'nodegroups', 'leases', SEP, 'reinstall_node', 'init_node','bootcd', 'configure_qemu', 'export_qemu', 'kill_all_qemus', 'start_node', SEP, # better use of time: do this now that the nodes are taking off 'plcsh_stress_test', SEP, - 'install_sfa', 'configure_sfa', 'import_sfa', 'start_sfa', SEP, - 'setup_sfa', 'add_sfa', 'update_sfa', 'view_sfa', SEP, - 'nodes_ssh_debug', 'nodes_ssh_boot', 'check_slice', 'check_initscripts', SEP, - # optionally run sfa later; takes longer, but checks more about nm - # 'install_sfa', 'configure_sfa', 'import_sfa', 'start_sfa', SEP, - # 'setup_sfa', 'add_sfa', 'update_sfa', 'view_sfa', SEP, - 'check_slice_sfa', 'delete_sfa', 'stop_sfa', SEP, + 'install_sfa', 'configure_sfa', 'import_sfa', 'start_sfa', SEPSFA, + 'setup_sfa', 'add_sfa', 'update_sfa', 'view_sfa', SEPSFA, + 'nodes_ssh_debug', 'nodes_ssh_boot', 'check_slice', 'check_initscripts', SEPSFA, + 'check_slice_sfa', 'delete_sfa', 'stop_sfa', SEPSFA, 'check_tcp', 'check_hooks', SEP, - 'force_gather_logs', 'force_resources_post', + 'force_gather_logs', 'force_resources_post', SEP, ] other_steps = [ 'show_boxes', 'resources_list','resources_release','resources_release_plc','resources_release_qemu',SEP, 'stop', 'vs_start', SEP, 'clean_initscripts', 'clean_nodegroups','clean_all_sites', SEP, 'clean_sites', 'clean_nodes', 'clean_slices', 'clean_keys', SEP, + 'clean_leases', 'list_leases', SEP, 'populate' , SEP, 'list_all_qemus', 'list_qemus', 'kill_qemus', SEP, 'db_dump' , 'db_restore', SEP, - 'standby_1 through 20', + 'standby_1 through 20',SEP, ] @staticmethod def printable_steps (list): - return " ".join(list).replace(" "+SEP+" "," \\\n") + single_line=" ".join(list)+" " + return single_line.replace(" "+SEP+" "," \\\n").replace(" "+SEPSFA+" "," \\\n") @staticmethod def valid_step (step): - return step != SEP + return step != SEP and step != SEPSFA # turn off the sfa-related steps when build has skipped SFA # this is originally for centos5 as recent SFAs won't build on this platformb @@ -127,8 +129,10 @@ class TestPlc: retcod=os.system ("curl --silent %s/ | grep -q sfa"%rpms_url) # full builds are expected to return with 0 here if retcod!=0: - TestPlc.default_steps = [ step for step in TestPlc.default_steps - if step.find('sfa') < 0 ] + # move all steps containing 'sfa' from default_steps to other_steps + sfa_steps= [ step for step in TestPlc.default_steps if step.find('sfa')>=0 ] + TestPlc.other_steps += sfa_steps + for step in sfa_steps: TestPlc.default_steps.remove(step) def __init__ (self,plc_spec,options): self.plc_spec=plc_spec @@ -367,8 +371,8 @@ class TestPlc: elif k == 'address_fields': pass else: - print '+ ',k, - PrettyPrinter(indent=8,depth=2).pprint(v) + print '+ ', + utils.pprint(k,v) def display_initscript_spec (self,initscript): print '+ ======== initscript',initscript['initscript_fields']['name'] @@ -399,10 +403,11 @@ class TestPlc: print '+ ',k,v def display_node_spec (self,node): - print "+ node",node['name'],"host_box=",node['host_box'], + print "+ node=%s host_box=%s"%(node['name'],node['host_box']), print "hostname=",node['node_fields']['hostname'], print "ip=",node['interface_fields']['ip'] - + if self.options.verbose: + utils.pprint("node details",node,depth=3) # another entry point for just showing the boxes involved def display_mapping (self): @@ -532,8 +537,9 @@ class TestPlc: tmpname='%s.plc-config-tty'%(self.name()) fileconf=open(tmpname,'w') for var in [ 'PLC_NAME', - 'PLC_ROOT_PASSWORD', 'PLC_ROOT_USER', + 'PLC_ROOT_PASSWORD', + 'PLC_SLICE_PREFIX', 'PLC_MAIL_ENABLED', 'PLC_MAIL_SUPPORT_ADDRESS', 'PLC_DB_HOST', @@ -543,7 +549,10 @@ class TestPlc: 'PLC_WWW_HOST', 'PLC_BOOT_HOST', 'PLC_NET_DNS1', - 'PLC_NET_DNS2']: + 'PLC_NET_DNS2', + 'PLC_RESERVATION_GRANULARITY', + 'PLC_OMF_ENABLED', + ]: fileconf.write ('e %s\n%s\n'%(var,self.plc_spec[var])) fileconf.write('w\n') fileconf.write('q\n') @@ -657,6 +666,68 @@ class TestPlc: "delete nodegroups with PLCAPI" return self.do_nodegroups("delete") + YEAR = 365*24*3600 + @staticmethod + def translate_timestamp (start,grain,timestamp): + if timestamp < TestPlc.YEAR: return start+timestamp*grain + else: return timestamp + + @staticmethod + def timestamp_printable (timestamp): + return time.strftime('%m-%d %H:%M:%S UTC',time.gmtime(timestamp)) + + def leases(self): + "create leases (on reservable nodes only, use e.g. run -c default -c resa)" + now=int(time.time()) + grain=self.apiserver.GetLeaseGranularity(self.auth_root()) + print 'API answered grain=',grain + start=(now/grain)*grain + start += grain + # find out all nodes that are reservable + nodes=self.all_reservable_nodenames() + if not nodes: + utils.header ("No reservable node found - proceeding without leases") + return True + ok=True + # attach them to the leases as specified in plc_specs + # this is where the 'leases' field gets interpreted as relative of absolute + for lease_spec in self.plc_spec['leases']: + # skip the ones that come with a null slice id + if not lease_spec['slice']: continue + lease_spec['t_from']=TestPlc.translate_timestamp(start,grain,lease_spec['t_from']) + lease_spec['t_until']=TestPlc.translate_timestamp(start,grain,lease_spec['t_until']) + lease_addition=self.apiserver.AddLeases(self.auth_root(),nodes, + lease_spec['slice'],lease_spec['t_from'],lease_spec['t_until']) + if lease_addition['errors']: + utils.header("Cannot create leases, %s"%lease_addition['errors']) + ok=False + else: + utils.header('Leases on nodes %r for %s from %d (%s) until %d (%s)'%\ + (nodes,lease_spec['slice'], + lease_spec['t_from'],TestPlc.timestamp_printable(lease_spec['t_from']), + lease_spec['t_until'],TestPlc.timestamp_printable(lease_spec['t_until']))) + + return ok + + def clean_leases (self): + "remove all leases in the myplc side" + lease_ids= [ l['lease_id'] for l in self.apiserver.GetLeases(self.auth_root())] + utils.header("Cleaning leases %r"%lease_ids) + self.apiserver.DeleteLeases(self.auth_root(),lease_ids) + return True + + def list_leases (self): + "list all leases known to the myplc" + leases = self.apiserver.GetLeases(self.auth_root()) + now=int(time.time()) + for l in leases: + current=l['t_until']>=now + if self.options.verbose or current: + utils.header("%s %s from %s until %s"%(l['hostname'],l['name'], + TestPlc.timestamp_printable(l['t_from']), + TestPlc.timestamp_printable(l['t_until']))) + return True + # create nodegroups if needed, and populate def do_nodegroups (self, action="add"): # 1st pass to scan contents @@ -728,10 +799,18 @@ class TestPlc: node_infos = [] for site_spec in self.plc_spec['sites']: node_infos += [ (node_spec['node_fields']['hostname'],node_spec['host_box']) \ - for node_spec in site_spec['nodes'] ] + for node_spec in site_spec['nodes'] ] return node_infos def all_nodenames (self): return [ x[0] for x in self.all_node_infos() ] + def all_reservable_nodenames (self): + res=[] + for site_spec in self.plc_spec['sites']: + for node_spec in site_spec['nodes']: + node_fields=node_spec['node_fields'] + if 'node_type' in node_fields and node_fields['node_type']=='reservable': + res.append(node_fields['hostname']) + return res # silent_minutes : during the first minutes nothing gets printed def nodes_check_boot_state (self, target_boot_state, timeout_minutes, silent_minutes,period=15): @@ -829,11 +908,11 @@ class TestPlc: def nodes_ssh_debug(self): "Tries to ssh into nodes in debug mode with the debug ssh key" - return self.check_nodes_ssh(debug=True,timeout_minutes=30,silent_minutes=5) + return self.check_nodes_ssh(debug=True,timeout_minutes=10,silent_minutes=5) def nodes_ssh_boot(self): "Tries to ssh into nodes in production mode with the root ssh key" - return self.check_nodes_ssh(debug=False,timeout_minutes=30,silent_minutes=15) + return self.check_nodes_ssh(debug=False,timeout_minutes=40,silent_minutes=15) @node_mapper def init_node (self): @@ -996,7 +1075,7 @@ class TestPlc: tmpname='%s.sfa-config-tty'%(self.name()) fileconf=open(tmpname,'w') for var in [ 'SFA_REGISTRY_ROOT_AUTH', - 'SFA_REGISTRY_LEVEL1_AUTH', +# 'SFA_REGISTRY_LEVEL1_AUTH', 'SFA_REGISTRY_HOST', 'SFA_AGGREGATE_HOST', 'SFA_SM_HOST', @@ -1005,7 +1084,8 @@ class TestPlc: 'SFA_PLC_DB_HOST', 'SFA_PLC_DB_USER', 'SFA_PLC_DB_PASSWORD', - 'SFA_PLC_URL']: + 'SFA_PLC_URL', + ]: fileconf.write ('e %s\n%s\n'%(var,self.plc_spec['sfa'][var])) fileconf.write('w\n') fileconf.write('R\n') @@ -1028,6 +1108,7 @@ class TestPlc: return self.run_in_guest('service sfa start')==0 def setup_sfa(self): + sfa_spec=self.plc_spec['sfa'] "sfi client configuration" dir_name=".sfi" if os.path.exists(dir_name): @@ -1040,23 +1121,23 @@ class TestPlc: file_name=dir_name + os.sep + 'sfi_config' fileconf=open(file_name,'w') - SFI_AUTH=self.plc_spec['sfa']['SFA_REGISTRY_ROOT_AUTH']+".main" + SFI_AUTH="%s.%s"%(sfa_spec['SFA_REGISTRY_ROOT_AUTH'],sfa_spec['login_base']) fileconf.write ("SFI_AUTH='%s'"%SFI_AUTH) fileconf.write('\n') SFI_USER=SFI_AUTH+'.fake-pi1' fileconf.write ("SFI_USER='%s'"%SFI_USER) fileconf.write('\n') - SFI_REGISTRY='http://' + self.plc_spec['sfa']['SFA_PLC_DB_HOST'] + ':12345/' + SFI_REGISTRY='http://' + sfa_spec['SFA_PLC_DB_HOST'] + ':12345/' fileconf.write ("SFI_REGISTRY='%s'"%SFI_REGISTRY) fileconf.write('\n') - SFI_SM='http://' + self.plc_spec['sfa']['SFA_PLC_DB_HOST'] + ':12347/' + SFI_SM='http://' + sfa_spec['SFA_PLC_DB_HOST'] + ':12347/' fileconf.write ("SFI_SM='%s'"%SFI_SM) fileconf.write('\n') fileconf.close() file_name=dir_name + os.sep + 'person.xml' fileconf=open(file_name,'w') - for record in self.plc_spec['sfa']['sfa_person_xml']: + for record in sfa_spec['sfa_person_xml']: person_record=record fileconf.write(person_record) fileconf.write('\n') @@ -1064,9 +1145,9 @@ class TestPlc: file_name=dir_name + os.sep + 'slice.xml' fileconf=open(file_name,'w') - for record in self.plc_spec['sfa']['sfa_slice_xml']: + for record in sfa_spec['sfa_slice_xml']: slice_record=record - #slice_record=self.plc_spec['sfa']['sfa_slice_xml'] + #slice_record=sfa_spec['sfa_slice_xml'] fileconf.write(slice_record) fileconf.write('\n') fileconf.close() @@ -1074,7 +1155,7 @@ class TestPlc: file_name=dir_name + os.sep + 'slice.rspec' fileconf=open(file_name,'w') slice_rspec='' - for (key, value) in self.plc_spec['sfa']['sfa_slice_rspec'].items(): + for (key, value) in sfa_spec['sfa_slice_rspec'].items(): slice_rspec +=value fileconf.write(slice_rspec) fileconf.write('\n')