From d502e1d5482497fd083e028d21f25091a469355b Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Thu, 23 Jan 2014 08:43:56 +0100 Subject: [PATCH] a more thorough implementation for ignored steps --- system/TestMain.py | 31 +++++++++++++++++++++++-------- system/TestPlc.py | 31 +++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/system/TestMain.py b/system/TestMain.py index a325223..70fae6b 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, @@ -187,7 +189,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") @@ -208,7 +210,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: @@ -295,6 +297,9 @@ 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 ] + + TestPlc.create_ignore_steps() # exclude selected=[] @@ -305,6 +310,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 @@ -369,8 +379,8 @@ steps refer to a method in TestPlc or to a step_* module 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 @@ -457,7 +467,12 @@ 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 + msg="OK" if step_result else "KO" + utils.header('********** %d IGNORED (%s) step %s on %s'%(plc_counter,msg,stepname,plcname)) + status="I[%s]"%msg + elif step_result: utils.header('********** %d SUCCESSFUL step %s on %s'%(plc_counter,stepname,plcname)) status="OK" else: diff --git a/system/TestPlc.py b/system/TestPlc.py index 6c215f5..a957cd6 100644 --- a/system/TestPlc.py +++ b/system/TestPlc.py @@ -72,7 +72,7 @@ def ignore_result (method): ref_method=TestPlc.__dict__[ref_name] result=ref_method(self) print "Actual - but ignored - result for %(ref_name)s is %(result)s"%locals() - return True + return Ignored (result) wrappee.__doc__="ignored version of " + method.__name__.replace('_ignore','').replace('ignore_','') return wrappee @@ -117,6 +117,10 @@ def auth_sfa_mapper (method): actual.__doc__=TestAuthSfa.__dict__[method.__name__].__doc__ return actual +class Ignored: + def __init__ (self,result): + self.result=result + SEP='' SEPSFA='' @@ -150,7 +154,7 @@ class TestPlc: 'empty_slices', 'ssh_slice_off', SEP, # check they are properly re-created with the same name 'fill_slices', 'ssh_slice_again_ignore', SEP, - 'force_gather_logs', SEP, + 'gather_logs_force', SEP, ] other_steps = [ 'export', 'show_boxes', SEP, @@ -1708,10 +1712,25 @@ class TestPlc: utils.header('Database restored from ' + dump) - @ignore_result - def ssh_slice_again_ignore (self): pass - @ignore_result - def check_initscripts_ignore (self): pass + @staticmethod + def create_ignore_steps (): + for step in TestPlc.default_steps + TestPlc.other_steps: + # default step can have a plc qualifier + if '@' in step: (step,qualifier)=step.split('@') + # or be defined as forced or ignored by default + for keyword in ['_ignore','_force']: + if step.endswith (keyword): step=step.replace(keyword,'') + if step == SEP or step == SEPSFA : continue + method=getattr(TestPlc,step) + name=step+'_ignore' + wrapped=ignore_result(method) +# wrapped.__doc__ = method.__doc__ + " (run in ignore-result mode)" + setattr(TestPlc, name, wrapped) + +# @ignore_result +# def ssh_slice_again_ignore (self): pass +# @ignore_result +# def check_initscripts_ignore (self): pass def standby_1_through_20(self): """convenience function to wait for a specified number of minutes""" -- 2.43.0