diff options
Diffstat (limited to 'dovetail/run.py')
-rwxr-xr-x | dovetail/run.py | 132 |
1 files changed, 92 insertions, 40 deletions
diff --git a/dovetail/run.py b/dovetail/run.py index 5b4dca8e..1133b864 100755 --- a/dovetail/run.py +++ b/dovetail/run.py @@ -22,8 +22,8 @@ from container import Container from testcase import Testcase from testcase import Testsuite from report import Report -from report import FunctestCrawler, YardstickCrawler -from report import FunctestChecker, YardstickChecker +from report import FunctestCrawler, YardstickCrawler, BottlenecksCrawler +from report import FunctestChecker, YardstickChecker, BottlenecksChecker from utils.dovetail_config import DovetailConfig as dt_cfg from test_runner import DockerRunner, ShellRunner @@ -46,11 +46,11 @@ def run_test(testsuite, testarea, logger): duration = 0 start_time = time.time() for testcase_name in testarea_list: - logger.info('>>[testcase]: %s', testcase_name) + logger.info('>>[testcase]: {}'.format(testcase_name)) testcase = Testcase.get(testcase_name) if testcase is None: - logger.error('test case %s is not defined in testcase folder, \ - skipping', testcase_name) + logger.error('Test case {} is not defined in testcase folder, ' + 'skipping.'.format(testcase_name)) continue run_testcase = True @@ -77,27 +77,30 @@ def check_tc_result(testcase, logger): dovetail_result = os.path.join(result_dir, dt_cfg.dovetail_config['result_file']) if dt_cfg.dovetail_config['report_dest'].startswith("http"): - if validate_type.lower() == 'yardstick': - logger.info("Results have been stored with file %s.", - os.path.join(result_dir, - testcase.validate_testcase() + '.out')) + if dt_utils.store_db_results(dt_cfg.dovetail_config['report_dest'], + dt_cfg.dovetail_config['build_tag'], + testcase.name(), dovetail_result, + logger): + logger.info("Results have been pushed to database and stored " + "with local file {}.".format(dovetail_result)) else: - if dt_utils.store_db_results(dt_cfg.dovetail_config['report_dest'], - dt_cfg.dovetail_config['build_tag'], - testcase.name(), dovetail_result, - logger): - logger.info("Results have been pushed to database and stored " - "with local file %s.", dovetail_result) - else: - logger.error("Fail to push results to database.") + logger.error("Failed to push results to database.") if dt_cfg.dovetail_config['report_dest'] == "file": if validate_type.lower() == 'yardstick': - logger.info("Results have been stored with file %s.", - os.path.join(result_dir, - testcase.validate_testcase() + '.out')) - if validate_type.lower() == 'functest': - logger.info("Results have been stored with file %s.", - os.path.join(result_dir, functest_result)) + result_file = os.path.join(result_dir, testcase.name() + '.out') + elif validate_type.lower() == 'functest': + result_file = os.path.join(result_dir, functest_result) + elif validate_type.lower() == 'bottlenecks': + result_file = os.path.join(result_dir, testcase.name() + '.out') + else: + logger.error("Don't support {} now.".format(validate_type)) + return + if os.path.isfile(result_file): + logger.info( + "Results have been stored with file {}.".format(result_file)) + else: + logger.error( + "Failed to store results with file {}.".format(result_file)) result = Report.get_result(testcase) Report.check_result(testcase, result) @@ -106,20 +109,27 @@ def validate_input(input_dict, check_dict, logger): # for 'func_tag' and 'yard_tag' options func_tag = input_dict['func_tag'] yard_tag = input_dict['yard_tag'] + bott_tag = input_dict['bott_tag'] valid_tag = check_dict['valid_docker_tag'] if func_tag is not None and func_tag not in valid_tag: - logger.error("func_tag can't be %s, valid in %s", func_tag, valid_tag) + logger.error("The input option 'func_tag' can't be {}, " + "valid values are {}.".format(func_tag, valid_tag)) raise SystemExit(1) if yard_tag is not None and yard_tag not in valid_tag: - logger.error("yard_tag can't be %s, valid in %s", yard_tag, valid_tag) + logger.error("The input option 'yard_tag' can't be {}, " + "valid values are {}.".format(yard_tag, valid_tag)) + raise SystemExit(1) + if bott_tag is not None and bott_tag not in valid_tag: + logger.error("The input option 'bott_tag' can't be {}, " + "valid values are {}.".format(bott_tag, valid_tag)) raise SystemExit(1) # for 'report' option report = input_dict['report'] if report: if not (report.startswith("http") or report == "file"): - logger.error("report can't be %s", input_dict['report']) - logger.info("valid report types are 'file' and 'http'") + logger.error("Report type can't be {}, valid types are 'file' " + "and 'http'.".format(input_dict['report'])) raise SystemExit(1) @@ -148,7 +158,7 @@ def filter_config(input_dict, logger): configs[key.upper()] = value_dict break except KeyError as e: - logger.exception('%s lacks subsection %s', config_key, e) + logger.exception('KeyError {}.'.format(e)) raise SystemExit(1) if not configs: return None @@ -161,8 +171,10 @@ def create_logs(): Report.create_log() FunctestCrawler.create_log() YardstickCrawler.create_log() + BottlenecksCrawler.create_log() FunctestChecker.create_log() YardstickChecker.create_log() + BottlenecksChecker.create_log() Testcase.create_log() Testsuite.create_log() DockerRunner.create_log() @@ -174,39 +186,77 @@ def clean_results_dir(): if os.path.exists(result_path): if os.path.isdir(result_path): cmd = 'sudo rm -rf %s/*' % (result_path) - dt_utils.exec_cmd(cmd, exit_on_error=False) + dt_utils.exec_cmd(cmd, exit_on_error=False, exec_msg_on=False) else: print "result_dir in dovetail_config.yml is not a directory." raise SystemExit(1) def get_result_path(): - dovetail_home = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + try: + dovetail_home = os.environ["DOVETAIL_HOME"] + except Exception: + print("ERROR: mandatory env variable 'DOVETAIL_HOME' is not found, " + "please set in env_config.sh and source this file before " + "running.") + return None result_path = os.path.join(dovetail_home, 'results') dt_cfg.dovetail_config['result_dir'] = result_path + pre_config_path = os.path.join(dovetail_home, 'pre_config') + patch_set_path = os.path.join(dovetail_home, 'patch') + dt_cfg.dovetail_config['config_dir'] = pre_config_path + dt_cfg.dovetail_config['patch_dir'] = patch_set_path + return dovetail_home -def get_userconfig_path(): - dovetail_home = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +def copy_userconfig_files(logger): + dovetail_home = os.path.dirname(os.path.abspath(__file__)) userconfig_path = os.path.join(dovetail_home, 'userconfig') - dt_cfg.dovetail_config['userconfig_dir'] = userconfig_path + pre_config_path = dt_cfg.dovetail_config['config_dir'] + if not os.path.isdir(pre_config_path): + os.makedirs(pre_config_path) + cmd = 'sudo cp -r %s/* %s' % (userconfig_path, pre_config_path) + dt_utils.exec_cmd(cmd, logger, exit_on_error=False) + + +def copy_patch_files(logger): + dovetail_home = os.path.dirname(os.path.abspath(__file__)) + patch_path = os.path.join(dovetail_home, 'patch') + patch_set_path = dt_cfg.dovetail_config['patch_dir'] + if not os.path.isdir(patch_set_path): + os.makedirs(patch_set_path) + cmd = 'sudo cp -r %s/* %s' % (patch_path, patch_set_path) + dt_utils.exec_cmd(cmd, logger, exit_on_error=False) + + +# env_init can source some env variable used in dovetail, such as +# when https+credential used, OS_CACERT +def env_init(logger): + openrc = os.path.join(dt_cfg.dovetail_config['config_dir'], + dt_cfg.dovetail_config['env_file']) + if not os.path.isfile(openrc): + logger.error("File {} does not exist.".format(openrc)) + dt_utils.source_env(openrc) def main(*args, **kwargs): """Dovetail compliance test entry!""" - build_tag = "daily-master-%s" % str(uuid.uuid4()) + build_tag = "daily-master-%s" % str(uuid.uuid1()) dt_cfg.dovetail_config['build_tag'] = build_tag - get_result_path() - get_userconfig_path() + if not get_result_path(): + return clean_results_dir() if kwargs['debug']: os.environ['DEBUG'] = 'true' create_logs() logger = dt_logger.Logger('run').getLogger() logger.info('================================================') - logger.info('Dovetail compliance: %s!', (kwargs['testsuite'])) + logger.info('Dovetail compliance: {}!'.format(kwargs['testsuite'])) logger.info('================================================') - logger.info('Build tag: %s', dt_cfg.dovetail_config['build_tag']) + logger.info('Build tag: {}'.format(dt_cfg.dovetail_config['build_tag'])) + env_init(logger) + copy_userconfig_files(logger) + copy_patch_files(logger) dt_utils.check_docker_version(logger) validate_input(kwargs, dt_cfg.dovetail_config['validate_input'], logger) configs = filter_config(kwargs, logger) @@ -218,6 +268,7 @@ def main(*args, **kwargs): if(kwargs['report'].endswith('/')): kwargs['report'] = kwargs['report'][0:kwargs['report'].rfind('/')] dt_cfg.dovetail_config['report_dest'] = kwargs['report'] + dt_cfg.update_cmds() if kwargs['offline']: dt_cfg.dovetail_config['offline'] = True @@ -238,9 +289,10 @@ def main(*args, **kwargs): duration = run_test(testsuite_yaml, testarea, logger) if dt_cfg.dovetail_config['report_dest'] == "file": Report.generate(testsuite_yaml, testarea, duration) + Report.save_logs() else: - logger.error('invalid input commands, testsuite %s testarea %s', - kwargs['testsuite'], testarea) + logger.error('Invalid input commands, testsuite {} testarea {}' + .format(kwargs['testsuite'], testarea)) dt_cfg.load_config_files() |