for (scope,steps) in scopes:
print '--------------------',scope
for step in [step for step in steps if TestPlc.valid_step(step)]:
+ try: (step,qualifier)=step.split('@')
+ except: pass
stepname=step
- if step.find("force_") == 0:
- stepname=step.replace("force_","")
- force=True
+ for special in ['force']:
+ stepname = stepname.replace(special+'_',"")
print '*',step,"\r",4*"\t",
try:
- print testplc_method_dict[stepname].__doc__
+ doc=testplc_method_dict[stepname].__doc__
except:
- print "*** no doc found"
+ doc=None
+ if doc: print doc
+ else: print "*** no doc found"
def run (self):
self.init_steps()
help="Specify the set of hostname/IP's to use for qemu boxes")
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,
+ help="run steps only on plc numbered <qualifier>, starting at 1")
+ parser.add_option("-k","--keep-going",action="store",dest="keep_going",default=False,
+ help="proceeds even if some steps are failing")
parser.add_option("-D","--dbname",action="store",dest="dbname",default=None,
- help="Used by db_dump and db_restore")
+ 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("-n","--dry-run", action="store_true", dest="dry_run", default=False,
help="Show environment and exits")
parser.add_option("-r","--restart-nm", action="store_true", dest="forcenm", default=False,
- help="Force the NM to restart in check_slices step")
+ help="Force the NM to restart in ssh_slices step")
parser.add_option("-t","--trace", action="store", dest="trace_file", default=None,
#default="logs/trace-@TIME@.txt",
help="Trace file location")
ips_qemu_file.close()
# build a TestPlc object from the result, passing options
for spec in all_plc_specs:
- spec['disabled'] = False
+ spec['failed_step'] = False
all_plcs = [ (x, TestPlc(x,self.options)) for x in all_plc_specs]
# pass options to utils as well
# allow for steps to specify an index like in
# run checkslice@2
try: (step,qualifier)=step.split('@')
- except: qualifier=None
+ except: qualifier=self.options.qualifier
# try and locate a method in TestPlc
if testplc_method_dict.has_key(step):
names.sort()
all_step_infos += [ ("%s.%s"%(step,name),module_dict[name],force,cross,qualifier) for name in names ]
except :
- print '********** step %s NOT FOUND -- ignored'%(step)
+ utils.header("********** FAILED step %s (NOT FOUND) -- won't be run"%step)
traceback.print_exc()
overall_result = False
# do all steps on all plcs
TIME_FORMAT="%H-%M-%S"
- TRACE_FORMAT="TRACE: beg=%(beg)s end=%(end)s status=%(status)s step=%(stepname)s plc=%(plcname)s force=%(force)s\n"
+ TRACE_FORMAT="TRACE: %(plc_counter)d %(beg)s->%(end)s status=%(status)s step=%(stepname)s plc=%(plcname)s force=%(force)s\n"
for (stepname,method,force,cross,qualifier) in all_step_infos:
plc_counter=0
for (spec,plc_obj) in all_plcs:
# run the step
beg=strftime(TIME_FORMAT)
- if not spec['disabled'] or force or self.options.interactive:
+ if not spec['failed_step'] or force or self.options.interactive or self.options.keep_going:
skip_step=False
if self.options.interactive:
prompting=True
while prompting:
- msg="Run step %s on %s [r](un)/d(ry_run)/s(kip)/q(uit) ? "%(stepname,plcname)
+ msg="%d Run step %s on %s [r](un)/d(ry_run)/s(kip)/q(uit) ? "%(plc_counter,stepname,plcname)
answer=raw_input(msg).strip().lower() or "r"
answer=answer[0]
if answer in ['s','n']: # skip/no/next
continue
try:
force_msg=""
- if force: force_msg=" (forced)"
+ if force and spec['failed_step']: force_msg=" (forced after %s has failed)"%spec['failed_step']
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)
status="OK"
else:
overall_result = False
- spec['disabled'] = True
+ 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
- spec['disabled'] = True
+ spec['failed_step'] = stepname
traceback.print_exc()
utils.header ('********** %d FAILED (exception) Step %s on %s (discarded from further steps)'\
%(plc_counter,stepname,plcname))
# do not run, just display it's skipped
else:
- utils.header("********** %d IGNORED Plc %s is disabled - skipping step %s"%(plc_counter,plcname,stepname))
+ why="has failed %s"%spec['failed_step']
+ utils.header("********** %d SKIPPED Step %s on %s (%s)"%(plc_counter,stepname,plcname,why))
status="UNDEF"
if not self.options.dry_run:
end=strftime(TIME_FORMAT)