def __start_job_logging(self): # Enable test logger fmt = "%(asctime)s %(name)s %(levelname)-5.5s| %(message)s" test_handler = output.add_log_handler( LOG_JOB, logging.FileHandler, self.logfile, self.loglevel, fmt ) main_logger = logging.getLogger("avocado") main_logger.addHandler(test_handler) main_logger.setLevel(self.loglevel) self.__logging_handlers[test_handler] = [LOG_JOB.name, ""] # Enable console loggers enabled_logs = self.config.get("core.show") if "test" in enabled_logs and "early" not in enabled_logs: self._stdout_stderr = sys.stdout, sys.stderr # Enable std{out,err} but redirect both to stdout sys.stdout = STD_OUTPUT.stdout sys.stderr = STD_OUTPUT.stdout test_handler = output.add_log_handler( LOG_JOB, logging.StreamHandler, STD_OUTPUT.stdout, logging.DEBUG, fmt="%(message)s", ) main_logger.addHandler(test_handler) self.__logging_handlers[test_handler] = [LOG_JOB.name, ""]
def __start_job_logging(self): # Enable test logger fmt = ('%(asctime)s %(name)s %(levelname)-5.5s| %(message)s') test_handler = output.add_log_handler(LOG_JOB, logging.FileHandler, self.logfile, self.loglevel, fmt) main_logger = logging.getLogger('avocado') main_logger.addHandler(test_handler) main_logger.setLevel(self.loglevel) self.__logging_handlers[test_handler] = [LOG_JOB.name, ""] # Add --store-logging-streams fmt = '%(asctime)s %(levelname)-5.5s| %(message)s' formatter = logging.Formatter(fmt=fmt, datefmt='%H:%M:%S') # Store custom test loggers if self.config.get("run.test_runner") == 'runner': store_logging_stream = self.config.get( 'job.run.store_logging_stream') for name in store_logging_stream: name = re.split(r'(?<!\\):', name, maxsplit=1) if len(name) == 1: name = name[0] level = logging.INFO else: level = (int(name[1]) if name[1].isdigit() else logging.getLevelName(name[1].upper())) name = name[0] try: logname = "log" if name == "" else name logfile = os.path.join( self.logdir, logname + "." + logging.getLevelName(level)) handler = output.add_log_handler(name, logging.FileHandler, logfile, level, formatter) except ValueError as details: self.log.error( "Failed to set log for --store-logging-stream " "%s:%s: %s.", name, level, details) else: self.__logging_handlers[handler] = [name] # Enable console loggers enabled_logs = self.config.get("core.show") if ('test' in enabled_logs and 'early' not in enabled_logs): self._stdout_stderr = sys.stdout, sys.stderr # Enable std{out,err} but redirect both to stdout sys.stdout = STD_OUTPUT.stdout sys.stderr = STD_OUTPUT.stdout test_handler = output.add_log_handler(LOG_JOB, logging.StreamHandler, STD_OUTPUT.stdout, logging.DEBUG, fmt="%(message)s") main_logger.addHandler(test_handler) self.__logging_handlers[test_handler] = [LOG_JOB.name, ""]
def collect_sysinfo(basedir): """ Collect sysinfo to a base directory. """ output.add_log_handler(log.name) if not basedir: cwd = os.getcwd() timestamp = time.strftime("%Y-%m-%d-%H.%M.%S") basedir = os.path.join(cwd, f"sysinfo-{timestamp}") sysinfo_logger = SysInfo(basedir=basedir) sysinfo_logger.start() sysinfo_logger.end() log.info("Logged system information to %s", basedir)
def run_suite(self, test_suite, variants, timeout=0, replay_map=None, suite_order="variants-per-test"): """ Run one or more tests and report with test result. :param params_list: a list of param dicts. :param variants: A varianter iterator (unused here) :return: a set with types of test failures. """ del test_suite # using self.job.references instead del variants # we're not using multiplexation here if suite_order != "variants-per-test" and suite_order is not None: raise exceptions.JobError("execution-order %s is not supported " "for remote execution." % suite_order) del suite_order # suite_order is ignored for now if not timeout: # avoid timeout = 0 timeout = None summary = set() stdout_backup = sys.stdout stderr_backup = sys.stderr fabric_debugfile = os.path.join(self.job.logdir, 'remote.log') paramiko_logger = logging.getLogger('paramiko') fabric_logger = logging.getLogger('avocado.fabric') remote_logger = logging.getLogger('avocado.remote') app_logger = logging.getLogger('avocado.debug') fmt = ('%(asctime)s %(module)-10.10s L%(lineno)-.4d %(' 'levelname)-5.5s| %(message)s') formatter = logging.Formatter(fmt=fmt, datefmt='%H:%M:%S') file_handler = logging.FileHandler(filename=fabric_debugfile) file_handler.setFormatter(formatter) fabric_logger.addHandler(file_handler) paramiko_logger.addHandler(file_handler) remote_logger.addHandler(file_handler) if self.job.args.show_job_log: output.add_log_handler(paramiko_logger.name) logger_list = [output.LOG_JOB] sys.stdout = output.LoggingFile(loggers=logger_list) sys.stderr = output.LoggingFile(loggers=logger_list) try: try: self.setup() avocado_installed, _ = self.check_remote_avocado() if not avocado_installed: raise exceptions.JobError('Remote machine does not seem to' ' have avocado installed') except Exception as details: stacktrace.log_exc_info(sys.exc_info(), logger=LOG_JOB) raise exceptions.JobError(details) results = self.run_test(self.job.references, timeout) remote_log_dir = os.path.dirname(results['debuglog']) self.result.tests_total = results['total'] local_log_dir = self.job.logdir for tst in results['tests']: name = tst['test'].split('-', 1) name = [name[0]] + name[1].split(';') if len(name) == 3: name[2] = {"variant_id": name[2]} name = TestID(*name, no_digits=-1) state = dict(name=name, time_elapsed=tst['time'], time_start=tst['start'], time_end=tst['end'], status=tst['status'], logdir=tst['logdir'], logfile=tst['logfile'], fail_reason=tst['fail_reason'], job_logdir=local_log_dir, job_unique_id='') self.result.start_test(state) self.job._result_events_dispatcher.map_method( 'start_test', self.result, state) self.result.check_test(state) self.job._result_events_dispatcher.map_method( 'end_test', self.result, state) if state['status'] == "INTERRUPTED": summary.add("INTERRUPTED") elif not status.mapping[state['status']]: summary.add("FAIL") zip_filename = remote_log_dir + '.zip' zip_path_filename = os.path.join(local_log_dir, os.path.basename(zip_filename)) self.remote.receive_files(local_log_dir, zip_filename) archive.uncompress(zip_path_filename, local_log_dir) os.remove(zip_path_filename) self.result.end_tests() self.job._result_events_dispatcher.map_method( 'post_tests', self.job) finally: try: self.tear_down() except Exception as details: stacktrace.log_exc_info(sys.exc_info(), logger=LOG_JOB) raise exceptions.JobError(details) sys.stdout = stdout_backup sys.stderr = stderr_backup return summary
def run_suite(self, test_suite, variants, timeout=0, replay_map=None, suite_order="variants-per-test"): """ Run one or more tests and report with test result. :param params_list: a list of param dicts. :param variants: A varianter iterator (unused here) :return: a set with types of test failures. """ del test_suite # using self.job.references instead del variants # we're not using multiplexation here if suite_order != "variants-per-test" and suite_order is not None: raise exceptions.JobError("execution-order %s is not supported " "for remote execution." % suite_order) del suite_order # suite_order is ignored for now if not timeout: # avoid timeout = 0 timeout = None summary = set() stdout_backup = sys.stdout stderr_backup = sys.stderr fabric_debugfile = os.path.join(self.job.logdir, 'remote.log') paramiko_logger = logging.getLogger('paramiko') fabric_logger = logging.getLogger('avocado.fabric') remote_logger = logging.getLogger('avocado.remote') fmt = ('%(asctime)s %(module)-10.10s L%(lineno)-.4d %(' 'levelname)-5.5s| %(message)s') formatter = logging.Formatter(fmt=fmt, datefmt='%H:%M:%S') file_handler = logging.FileHandler(filename=fabric_debugfile) file_handler.setFormatter(formatter) fabric_logger.addHandler(file_handler) paramiko_logger.addHandler(file_handler) remote_logger.addHandler(file_handler) if self.job.args.show_job_log: output.add_log_handler(paramiko_logger.name) logger_list = [output.LOG_JOB] sys.stdout = output.LoggingFile(loggers=logger_list) sys.stderr = output.LoggingFile(loggers=logger_list) try: try: self.setup() avocado_installed, _ = self.check_remote_avocado() if not avocado_installed: raise exceptions.JobError('Remote machine does not seem to' ' have avocado installed') except Exception as details: stacktrace.log_exc_info(sys.exc_info(), logger=LOG_JOB) raise exceptions.JobError(details) results = self.run_test(self.job.references, timeout) remote_log_dir = os.path.dirname(results['debuglog']) self.result.tests_total = results['total'] local_log_dir = self.job.logdir for tst in results['tests']: name = tst['id'].split('-', 1) name = [name[0]] + name[1].split(';') if len(name) == 3: name[2] = {"variant_id": name[2]} name = TestID(*name, no_digits=-1) state = dict(name=name, time_elapsed=tst['time'], time_start=tst['start'], time_end=tst['end'], status=tst['status'], logdir=tst['logdir'], logfile=tst['logfile'], fail_reason=tst['fail_reason'], job_logdir=local_log_dir, job_unique_id='') self.result.start_test(state) self.job._result_events_dispatcher.map_method('start_test', self.result, state) self.result.check_test(state) self.job._result_events_dispatcher.map_method('end_test', self.result, state) if state['status'] == "INTERRUPTED": summary.add("INTERRUPTED") elif not status.mapping[state['status']]: summary.add("FAIL") zip_filename = remote_log_dir + '.zip' zip_path_filename = os.path.join(local_log_dir, os.path.basename(zip_filename)) self.remote.receive_files(local_log_dir, zip_filename) archive.uncompress(zip_path_filename, local_log_dir) os.remove(zip_path_filename) self.result.end_tests() self.job._result_events_dispatcher.map_method('post_tests', self.job) finally: try: self.tear_down() except Exception as details: stacktrace.log_exc_info(sys.exc_info(), logger=LOG_JOB) raise exceptions.JobError(details) sys.stdout = stdout_backup sys.stderr = stderr_backup return summary