From 60f1f328b2ebc94330dcbf5f4374684a410d3e92 Mon Sep 17 00:00:00 2001 From: MatthewLi Date: Thu, 5 Jan 2017 02:02:13 -0500 Subject: dovetail tool: command line JIRA: DOVETAIL-173 details please see https://wiki.opnfv.org/display/dovetail/Dovetail+Command+Line Change-Id: Iff04b0df8c4e6310d35a45b9c8ba3c7b3b5e1105 Signed-off-by: MatthewLi --- dovetail/cli/__init__.py | 0 dovetail/cli/cli_base.py | 56 ++++++++++++++++++ dovetail/cli/commands/__init__.py | 0 dovetail/cli/commands/cli_report.py | 0 dovetail/cli/commands/cli_testcase.py | 107 ++++++++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+) create mode 100644 dovetail/cli/__init__.py create mode 100644 dovetail/cli/cli_base.py create mode 100644 dovetail/cli/commands/__init__.py create mode 100644 dovetail/cli/commands/cli_report.py create mode 100644 dovetail/cli/commands/cli_testcase.py (limited to 'dovetail/cli') diff --git a/dovetail/cli/__init__.py b/dovetail/cli/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dovetail/cli/cli_base.py b/dovetail/cli/cli_base.py new file mode 100644 index 00000000..c0d57e86 --- /dev/null +++ b/dovetail/cli/cli_base.py @@ -0,0 +1,56 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import click +from pbr import version +from dovetail.cli.commands.cli_testcase import CliTestcase + + +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) +cli_version = version.VersionInfo('dovetail').version_string() + + +@click.group(context_settings=CONTEXT_SETTINGS) +@click.version_option(version=cli_version) +def cli(): + pass + + +_testcase = CliTestcase() + + +@cli.command('list', + help='list the testsuite details') +@click.argument('testsuite', type=click.STRING, required=False) +def testcase_list(testsuite): + _testcase.list_testcase(testsuite) + + +@cli.command('show', + help='show the testcases details') +@click.argument('testcase', type=click.STRING, required=True) +def testcase_show(testcase): + _testcase.show_testcase(testcase) + + +@cli.command('run', + context_settings=dict( + ignore_unknown_options=True, help_option_names=[]), + help='run the testcases') +@click.argument('run_args', nargs=-1, type=click.UNPROCESSED) +def testcase_run(run_args): + args_list = [] + list(run_args) + args_str = ' '.join(args_list) + _testcase.run(args_str) + + +# @cli.command('report', help='testcases running result report') +# @click.option('--encrypt', default=True, +# help='report the test result with encryption') +# def run(**kwargs): +# CliReport.execute(**kwargs) diff --git a/dovetail/cli/commands/__init__.py b/dovetail/cli/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dovetail/cli/commands/cli_report.py b/dovetail/cli/commands/cli_report.py new file mode 100644 index 00000000..e69de29b diff --git a/dovetail/cli/commands/cli_testcase.py b/dovetail/cli/commands/cli_testcase.py new file mode 100644 index 00000000..b1c38fd5 --- /dev/null +++ b/dovetail/cli/commands/cli_testcase.py @@ -0,0 +1,107 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import os +import sys +import yaml +import click +import six + +import dovetail.utils.dovetail_utils as dt_utils +from dovetail.utils.dovetail_config import DovetailConfig as dt_cfg +from dovetail.testcase import Testsuite + + +class CliTestcase: + + @classmethod + def testsuite_load(cls): + dt_cfg.load_config_files() + Testsuite.load() + + @classmethod + def get_path(cls, path): + if isinstance(path, six.string_types): + dt_cfg.load_config_files() + dovetail_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), + os.pardir, os.pardir)) + relative_path = dt_cfg.dovetail_config[path] + abs_path = os.path.join(dovetail_dir, relative_path) + else: + click.echo("input %s is not a string" % path) + sys.exit(1) + return abs_path + + def list_testcase(self, testsuite): + self.testsuite_load() + if testsuite: + testsuite_stream = Testsuite.get(testsuite) + if testsuite_stream: + testcase_list = [] + for value in testsuite_stream['testcases_list']: + if value is not None: + testcase_list.append(value) + testarea_list = [] + for testcase in testcase_list: + testarea = testcase.split('.')[1] + if testarea not in testarea_list: + testarea_list.append(testarea) + for testarea in testarea_list: + click.echo("- %s" % testarea) + for testcase in testcase_list: + if testarea in testcase: + click.echo(" %s" % testcase) + else: + click.echo("testsuite %s does not exist or not supported" + % testsuite) + else: + testsuite_json = Testsuite.get_all() + if testsuite_json: + for key, value in testsuite_json.items(): + click.echo("- %s" % key) + testsuite_stream = Testsuite.get(key) + if testsuite_stream['testcases_list']: + for testcase in testsuite_stream['testcases_list']: + click.echo(" %s" % testcase) + else: + click.echo("No testcase in testsuite %s" % key) + else: + click.echo("No testsuite defined yet in dovetail!!!") + + def show_testcase(self, testcase): + abs_testcase_path = self.get_path('TESTCASE_PATH') + if testcase.startswith("dovetail."): + testcase_yml = testcase[9:] + '.yml' + else: + testcase_yml = testcase + '.yml' + for root, dirs, files in os.walk(abs_testcase_path): + if testcase_yml in files: + testcase_path = abs_testcase_path + testcase_yml + with open(testcase_path, 'r') as stream: + try: + click.echo(stream.read()) + except yaml.YAMLError as exc: + click.echo(exc) + else: + click.echo("testcase %s does not exist or not supported" + % testcase) + + def run(self, args_str): + options = '' + if args_str: + options = options + args_str + + repo_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), + os.pardir, os.pardir)) + + cmd = ("python %s/run.py" + " %s" % (repo_dir, options)) + dt_utils.exec_cmd(cmd, exit_on_error=False, + exec_msg_on=False, info=True) -- cgit 1.2.3-korg