summaryrefslogtreecommitdiffstats
path: root/dovetail/run.py
diff options
context:
space:
mode:
Diffstat (limited to 'dovetail/run.py')
-rwxr-xr-xdovetail/run.py132
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()