def gen_filename(self, settings, batch, argset, rep): filename = "batch-%s-%s-%s" % ( settings.BATCH_NAME, batch['batch_time'], batch.get('filename_extra', "%s-%s" % (argset, rep)) ) return clean_path(filename)
def run_batch(self, batchname): if not batchname in self.batches: raise RuntimeError("Can't find batch '%s' to run." % batchname) batch = self.batches[batchname] batch.update(self.settings.BATCH_OVERRIDE) # A batch declared 'abstract' is not runnable if batch.get('abstract', False): sys.stderr.write(" Batch marked as abstract. Not running.\n") return False elif batch.get('disabled', False) or not batch.get('enabled', True): sys.stderr.write(" Batch disabled.\n") return False argsets = [] for k in batch.keys(): if k.startswith("for_"): argsets.append([i.strip() for i in batch[k].split(',')]) reps = range(1, int(batch.get('repetitions', 1)) + 1) argsets.append(reps) pause = int(batch.get('pause', 0)) for argset in itertools.product(*argsets): rep = argset[-1] argset = argset[:-1] sys.stderr.write(" args:%s rep:%02d.\n" % (",".join(argset), rep)) settings = self.settings.copy() settings.FORMAT = 'null' settings.BATCH_NAME = batchname settings.BATCH_TIME = self.settings.TIME settings.TIME = datetime.now() expand_vars = { 'repetition': "%02d" % rep, 'batch_time': settings.BATCH_TIME.strftime("%Y-%m-%dT%H%M%S") } for arg in argset: if not arg in self.args: raise RuntimeError("Invalid arg: '%s'." % arg) expand_vars.update(self.args[arg]) b = self.apply_args(batch, expand_vars, settings) if not 'test_name' in b: raise RuntimeError("Missing test name.") settings.load_rcvalues(b.items(), override=True) settings.NAME = b['test_name'] settings.load_test(informational=settings.BATCH_DRY) settings.DATA_FILENAME = self.gen_filename(settings, b, argset, rep) if 'output_path' in b: output_path = clean_path(b['output_path'], allow_dirs=True) else: output_path = os.path.dirname(settings.OUTPUT) or "." if settings.BATCH_DRY: sys.stderr.write(" Would output to: %s.\n" % output_path) elif not os.path.exists(output_path): try: os.makedirs(output_path) except OSError as e: raise RuntimeError( "Unable to create output path '%s': %s." % (output_path, e)) commands = self.commands_for(b, settings) if not settings.BATCH_DRY: self.log_fd = open( os.path.join(output_path, "%s.log" % settings.DATA_FILENAME), "a") if b.get('debug_log', False): settings.LOG_FILE = os.path.join( output_path, "%s.debug.log" % settings.DATA_FILENAME) self.run_commands(commands, 'pre') self.run_commands(commands, 'monitor') try: if settings.BATCH_DRY: sys.stderr.write(" Would run test '%s'.\n" % settings.NAME) sys.stderr.write(" data_filename=%s\n" % settings.DATA_FILENAME) for k in sorted([i.lower() for i in CONFIG_TYPES.keys()]): if k in b: sys.stderr.write(" %s=%s\n" % (k, b[k])) else: self.run_test(settings, output_path) except KeyboardInterrupt: self.run_commands(commands, 'post', essential_only=True) raise except: self.run_commands(commands, 'post', essential_only=True) sys.stderr.write(" Error running test: %s\n" % " ".join( traceback.format_exception_only(*sys.exc_info()[:2]))) else: try: self.run_commands(commands, 'post') except: self.run_commands(commands, 'post', essential_only=True) sys.stderr.write(" Error running post-commands: %s\n" % " ".join( traceback.format_exception_only( *sys.exc_info()[:2]))) finally: self.kill_children() if self.log_fd: self.log_fd.close() self.log_fd = None if settings.BATCH_DRY: sys.stderr.write(" Would sleep for %d seconds.\n" % pause) else: time.sleep(pause)
def gen_filename(self, settings, batch, argset, rep): filename = "batch-%s-%s-%s" % (settings.BATCH_NAME, batch['batch_time'], batch.get('filename_extra', "%s-%s" % (argset, rep))) return clean_path(filename)
def run_batch(self, batchname): if not batchname in self.batches: raise RuntimeError("Can't find batch '%s' to run." % batchname) batch = self.batches[batchname] batch.update(self.settings.BATCH_OVERRIDE) # A batch declared 'abstract' is not runnable if batch.get('abstract', False): sys.stderr.write(" Batch marked as abstract. Not running.\n") return False elif batch.get('disabled', False) or not batch.get('enabled', True): sys.stderr.write(" Batch disabled.\n") return False argsets = [] for k in batch.keys(): if k.startswith("for_"): argset = [] for a in batch[k].split(','): a = a.strip().lower() matches = [arg for arg in self.args if fnmatch(arg,a)] if not matches: raise RuntimeError("No matches for arg: '%s'." % a) argset.extend(matches) argsets.append(argset) reps = range(1,int(batch.get('repetitions', 1))+1) argsets.append(reps) pause = int(batch.get('pause', 0)) for argset in itertools.product(*argsets): rep = argset[-1] argset = argset[:-1] settings = self.settings.copy() sys.stderr.write(" args:%s rep:%02d" % (",".join(argset),rep)) if settings.BATCH_DRY: sys.stderr.write(" (dry run)") sys.stderr.write(".\n") settings.FORMAT = 'null' settings.BATCH_NAME = batchname settings.BATCH_TIME = self.settings.TIME settings.TIME = datetime.now() expand_vars = {'repetition': "%02d" % rep, 'batch_time': settings.BATCH_TIME.strftime("%Y-%m-%dT%H%M%S")} for arg in argset: if not arg in self.args: raise RuntimeError("Invalid arg: '%s'." % arg) expand_vars.update(self.args[arg]) b = self.apply_args(batch, expand_vars, settings) if not 'test_name' in b: raise RuntimeError("Missing test name.") settings.load_rcvalues(b.items(), override=True) settings.NAME = b['test_name'] settings.load_test(informational=settings.BATCH_DRY) settings.DATA_FILENAME = self.gen_filename(settings, b, argset, rep) if 'output_path' in b: output_path = clean_path(b['output_path'], allow_dirs=True) else: output_path = os.path.dirname(settings.OUTPUT) or "." if settings.BATCH_DRY and settings.BATCH_VERBOSE: sys.stderr.write(" Would output to: %s.\n" % output_path) elif not settings.BATCH_DRY and not os.path.exists(output_path): try: os.makedirs(output_path) except OSError as e: raise RuntimeError("Unable to create output path '%s': %s." % (output_path,e)) commands = self.commands_for(b, settings) if not settings.BATCH_DRY: self.log_fd = io.open(os.path.join(output_path,"%s.log" % settings.DATA_FILENAME), "at") if b.get('debug_log', False): settings.LOG_FILE = os.path.join(output_path,"%s.debug.log" % settings.DATA_FILENAME) self.run_commands(commands, 'pre') self.run_commands(commands, 'monitor') try: if settings.BATCH_VERBOSE: if settings.BATCH_DRY: sys.stderr.write(" Would run test '%s'.\n" % settings.NAME) else: sys.stderr.write(" Running test '%s'.\n" % settings.NAME) sys.stderr.write(" data_filename=%s\n" % settings.DATA_FILENAME) for k in sorted([i.lower() for i in CONFIG_TYPES.keys()]): if k in b: sys.stderr.write(" %s=%s\n" % (k, b[k])) if settings.BATCH_DRY: self.tests_run += 1 else: self.run_test(settings, output_path) except KeyboardInterrupt: self.run_commands(commands, 'post', essential_only=True) raise except: self.run_commands(commands, 'post', essential_only=True) sys.stderr.write(" Error running test: %s\n" % " ".join(traceback.format_exception_only(*sys.exc_info()[:2]))) else: try: self.run_commands(commands, 'post') except: self.run_commands(commands, 'post', essential_only=True) sys.stderr.write(" Error running post-commands: %s\n" % " ".join(traceback.format_exception_only(*sys.exc_info()[:2]))) finally: self.kill_children() if self.log_fd: self.log_fd.close() self.log_fd = None if settings.BATCH_DRY and settings.BATCH_VERBOSE: sys.stderr.write(" Would sleep for %d seconds.\n" % pause) elif not settings.BATCH_DRY: time.sleep(pause)