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
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):
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,
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")
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:
# 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=[]
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
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
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:
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
actual.__doc__=TestAuthSfa.__dict__[method.__name__].__doc__
return actual
+class Ignored:
+ def __init__ (self,result):
+ self.result=result
+
SEP='<sep>'
SEPSFA='<sep_sfa>'
'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,
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"""