X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=system%2FTestMain.py;h=0ec1fbb81815f96657d80305e1ed39eaebeca505;hb=daa6101bf7c504d89de2eb6bbd06821e2f550539;hp=ae4a861cbe5afea25165f55536b85c0ee1be8582;hpb=70d525866c311347e2ee193e5679cfcf6dc60607;p=tests.git diff --git a/system/TestMain.py b/system/TestMain.py index ae4a861..0ec1fbb 100755 --- a/system/TestMain.py +++ b/system/TestMain.py @@ -11,7 +11,7 @@ import readline import glob import utils -from TestPlc import TestPlc +from TestPlc import TestPlc, Ignored from TestSite import TestSite from TestNode import TestNode from macros import sequences @@ -127,8 +127,8 @@ class TestMain: try: (step,qualifier)=step.split('@') except: pass stepname=step - for special in ['force']: - stepname = stepname.replace(special+'_',"") + for special in ['force','ignore']: + stepname = stepname.replace('_'+special,"") Step(stepname).print_doc() def run (self): @@ -159,6 +159,8 @@ steps refer to a method in TestPlc or to a step_* module help="fcdistro - as in vbuild-nightly") parser.add_option("-e","--exclude",action="append", dest="exclude", default=[], help="steps to exclude - can be set multiple times, or use quotes") + parser.add_option("-i","--ignore",action="append", dest="ignore", default=[], + help="steps to run but ignore - can be set multiple times, or use quotes") parser.add_option("-a","--all",action="store_true",dest="all_steps", default=False, help="Run all default steps") parser.add_option("-l","--list",action="store_true",dest="list_steps", default=False, @@ -171,8 +173,6 @@ steps refer to a method in TestPlc or to a step_* module help="Specify the set of hostnames for the boxes that host the nodes") parser.add_option("-N","--nodes",action="append", dest="ips_vnode", default=[], help="Specify the set of hostname/IP's to use for vnodes") - parser.add_option ('-X', "--lxc",action='store_true',dest='plcs_use_lxc', - help='use lxc-enabled plc boxes instead of vs-enabled ones') parser.add_option("-s","--size",action="store",type="int",dest="size",default=1, help="sets test size in # of plcs - default is 1") parser.add_option("-q","--qualifier",action="store",type="int",dest="qualifier",default=None, @@ -185,7 +185,7 @@ steps refer to a method in TestPlc or to a step_* module help="Used by plc_db_dump and plc_db_restore") parser.add_option("-v","--verbose", action="store_true", dest="verbose", default=False, help="Run in verbose mode") - parser.add_option("-i","--interactive",action="store_true",dest="interactive",default=False, + parser.add_option("-I","--interactive",action="store_true",dest="interactive",default=False, help="prompts before each step") parser.add_option("-n","--dry-run", action="store_true", dest="dry_run", default=False, help="Show environment and exits") @@ -206,7 +206,7 @@ steps refer to a method in TestPlc or to a step_* module result.append(el) return result # flatten relevant options - for optname in ['config','exclude','ips_bplc','ips_vplc','ips_bnode','ips_vnode']: + for optname in ['config','exclude','ignore','ips_bplc','ips_vplc','ips_bnode','ips_vnode']: setattr(self.options,optname, flatten ( [ arg.split() for arg in getattr(self.options,optname) ] )) if not self.options.rspec_styles: @@ -224,7 +224,6 @@ steps refer to a method in TestPlc or to a step_* module ('personality','arg-personality',"linux64",None), ('pldistro','arg-pldistro',"onelab",None), ('fcdistro','arg-fcdistro','f14',None), - ('plcs_use_lxc','arg-plcs-use-lxc',False,None), ) : # print 'handling',recname path=filename @@ -282,7 +281,7 @@ steps refer to a method in TestPlc or to a step_* module if self.options.list_steps: self.init_steps() self.list_steps() - return True + return 'SUCCESS' # steps if not self.options.steps: @@ -293,6 +292,10 @@ steps refer to a method in TestPlc or to a step_* module # rewrite '-' into '_' in step names self.options.steps = [ step.replace('-','_') for step in self.options.steps ] self.options.exclude = [ step.replace('-','_') for step in self.options.exclude ] + self.options.ignore = [ step.replace('-','_') for step in self.options.ignore ] + + # technicality, decorate known steps to produce the '_ignore' version + TestPlc.create_ignore_steps() # exclude selected=[] @@ -303,6 +306,11 @@ steps refer to a method in TestPlc or to a step_* module keep=False break if keep: selected.append(step) + + # ignore + selected = [ step if step not in self.options.ignore else step+"_ignore" + for step in selected ] + self.options.steps=selected # this is useful when propagating on host boxes, to avoid conflicts @@ -324,7 +332,6 @@ steps refer to a method in TestPlc or to a step_* module raise # provision on local substrate - if self.options.plcs_use_lxc: LocalSubstrate.local_substrate.rescope (plcs_on_vs=False, plcs_on_lxc=True) all_plc_specs = LocalSubstrate.local_substrate.provision(all_plc_specs,self.options) # remember substrate IP address(es) for next run @@ -334,7 +341,7 @@ steps refer to a method in TestPlc or to a step_* module ips_bplc_file.close() ips_vplc_file=open('arg-ips-vplc','w') for plc_spec in all_plc_specs: - ips_vplc_file.write("%s\n"%plc_spec['PLC_API_HOST']) + ips_vplc_file.write("%s\n"%plc_spec['settings']['PLC_API_HOST']) ips_vplc_file.close() # ditto for nodes ips_bnode_file=open('arg-ips-bnode','w') @@ -360,15 +367,15 @@ steps refer to a method in TestPlc or to a step_* module # pass options to utils as well utils.init_options(self.options) - overall_result = True + overall_result = 'SUCCESS' all_step_infos=[] for step in self.options.steps: if not TestPlc.valid_step(step): continue # some steps need to be done regardless of the previous ones: we force them force=False - if step.find("force_") == 0: - step=step.replace("force_","") + if step.endswith("_force"): + step=step.replace("_force","") force=True # allow for steps to specify an index like in # run checkslice@2 @@ -387,7 +394,7 @@ steps refer to a method in TestPlc or to a step_* module except : utils.header("********** FAILED step %s (NOT FOUND) -- won't be run"%step) traceback.print_exc() - overall_result = False + overall_result = 'FAILURE' if self.options.dry_run: self.show_env(self.options,"Dry run") @@ -429,7 +436,7 @@ steps refer to a method in TestPlc or to a step_* module skip_step=True elif answer in ['q','b']: # quit/bye print 'Exiting' - return + return 'FAILURE' elif answer in ['d']: # dry_run dry_run=self.options.dry_run self.options.dry_run=True @@ -455,17 +462,28 @@ steps refer to a method in TestPlc or to a step_* module utils.header("********** %d RUNNING step %s%s on plc %s"%(plc_counter,stepname,force_msg,plcname)) if not cross: step_result = method(plc_obj) else: step_result = method(plc_obj,across_plcs) - if step_result: + if isinstance (step_result,Ignored): + step_result=step_result.result + if step_result: + msg="OK" + else: + msg="KO" + # do not overwrite if FAILURE + if overall_result=='SUCCESS': + overall_result='IGNORED' + utils.header('********** %d IGNORED (%s) step %s on %s'%(plc_counter,msg,stepname,plcname)) + status="%s[I]"%msg + elif step_result: utils.header('********** %d SUCCESSFUL step %s on %s'%(plc_counter,stepname,plcname)) status="OK" else: - overall_result = False + overall_result = 'FAILURE' spec['failed_step'] = stepname utils.header('********** %d FAILED Step %s on %s (discarded from further steps)'\ %(plc_counter,stepname,plcname)) status="KO" except: - overall_result=False + overall_result='FAILURE' spec['failed_step'] = stepname traceback.print_exc() utils.header ('********** %d FAILED (exception) Step %s on %s (discarded from further steps)'\ @@ -495,19 +513,25 @@ steps refer to a method in TestPlc or to a step_* module return overall_result # wrapper to run, returns a shell-compatible result + # retcod: + # 0: SUCCESS + # 1: FAILURE + # 2: SUCCESS but some ignored steps failed + # 3: OTHER ERROR def main(self): try: success=self.run() - if success: - return 0 - else: - return 1 + if success == 'SUCCESS': return 0 + elif success == 'IGNORED': return 2 + else: return 1 except SystemExit: print 'Caught SystemExit' - raise + return 3 except: traceback.print_exc() - return 2 + return 3 if __name__ == "__main__": - sys.exit(TestMain().main()) + exit_code = TestMain().main() + print "TestMain exit code",exit_code + sys.exit(exit_code)