From 40f49a42dd8476ad2332ecf2e0a57e6bf511aa63 Mon Sep 17 00:00:00 2001 From: Jo¶rgen Karlsson Date: Fri, 12 Jun 2015 11:19:57 +0200 Subject: add new command line handler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New command line handler with pluggable classes. Task subcommand added. To run a scenario: yardstick -d task start samples/ping.yaml $ yardstick -h usage: yardstick [-h] [-V] [-d] [-v] {task} ... Command-line interface to yardstick optional arguments: -h, --help show this help message and exit -V, --version display version -d, --debug increase output verbosity to debug -v, --verbose increase output verbosity to info subcommands: {task} $ yardstick task -h usage: yardstick task [-h] {start} ... Task commands. Set of commands to manage benchmark tasks. optional arguments: -h, --help show this help message and exit subcommands: {start} $ yardstick task start -h usage: yardstick task start [-h] [--keep-deploy] [--parse-only] [--output-file OUTPUT_FILE] taskfile Start a benchmark scenario. positional arguments: taskfile path to taskfile optional arguments: -h, --help show this help message and exit --keep-deploy keep context deployed in cloud --parse-only parse the benchmark config file and exit --output-file OUTPUT_FILE file where output is stored, default /tmp/yardstick.out JIRA :- Signed-off-by: Jo¶rgen Karlsson Change-Id: If0672594efa4c94c94ebb73f0bc97ecfe3e00c62 --- yardstick/main.py | 149 +----------------------------------------------------- 1 file changed, 2 insertions(+), 147 deletions(-) (limited to 'yardstick/main.py') diff --git a/yardstick/main.py b/yardstick/main.py index e8f6b54aa..c16a42e91 100755 --- a/yardstick/main.py +++ b/yardstick/main.py @@ -38,159 +38,14 @@ NFV TST """ - import sys -import yaml -import atexit -import pkg_resources -import ipaddress - -from yardstick.benchmark.context.model import Context -from yardstick.benchmark.runners import base as base_runner -from yardstick.cmdparser import CmdParser - - -class TaskParser(object): - '''Parser for task config files in yaml format''' - def __init__(self, path): - self.path = path - - def parse(self): - '''parses the task file and return an context and scenario instances''' - print "Parsing task config:", self.path - try: - with open(self.path) as stream: - cfg = yaml.load(stream) - except IOError as ioerror: - sys.exit(ioerror) - - if cfg["schema"] != "yardstick:task:0.1": - sys.exit("error: file %s has unknown schema %s" % (self.path, - cfg["schema"])) - - # TODO: support one or many contexts? Many would simpler and precise - if "context" in cfg: - context_cfgs = [cfg["context"]] - else: - context_cfgs = cfg["contexts"] - - for cfg_attrs in context_cfgs: - context = Context() - context.init(cfg_attrs) - - run_in_parallel = cfg.get("run_in_parallel", False) - - # TODO we need something better here, a class that represent the file - return cfg["scenarios"], run_in_parallel - - -def atexit_handler(): - '''handler for process termination''' - base_runner.Runner.terminate_all() - - if len(Context.list) > 0: - print "Undeploying all contexts" - for context in Context.list: - context.undeploy() - - -def is_ip_addr(addr): - '''check if string addr is an IP address''' - try: - ipaddress.ip_address(unicode(addr)) - return True - except ValueError: - return False - - -def run_one_scenario(scenario_cfg, output_file): - '''run one scenario using context''' - key_filename = pkg_resources.resource_filename( - 'yardstick.resources', 'files/yardstick_key') - - host = Context.get_server(scenario_cfg["host"]) - runner_cfg = scenario_cfg["runner"] - runner_cfg['host'] = host.public_ip - runner_cfg['user'] = host.context.user - runner_cfg['key_filename'] = key_filename - runner_cfg['output_filename'] = output_file - - if "target" in scenario_cfg: - if is_ip_addr(scenario_cfg["target"]): - scenario_cfg["ipaddr"] = scenario_cfg["target"] - else: - target = Context.get_server(scenario_cfg["target"]) - - # get public IP for target server, some scenarios require it - if target.public_ip: - runner_cfg['target'] = target.public_ip - - # TODO scenario_cfg["ipaddr"] is bad naming - if host.context != target.context: - # target is in another context, get its public IP - scenario_cfg["ipaddr"] = target.public_ip - else: - # target is in the same context, get its private IP - scenario_cfg["ipaddr"] = target.private_ip - - runner = base_runner.Runner.get(runner_cfg) - - print "Starting runner of type '%s'" % runner_cfg["type"] - runner.run(scenario_cfg["type"], scenario_cfg) - - return runner - - -def runner_join(runner): - '''join (wait for) a runner, exit process at runner failure''' - status = runner.join() - base_runner.Runner.release(runner) - if status != 0: - sys.exit("Runner failed") +from yardstick.cmd.cli import YardstickCLI def main(): '''yardstick main''' - - atexit.register(atexit_handler) - - prog_args = CmdParser().parse_args() - - parser = TaskParser(prog_args.taskfile[0]) - scenarios, run_in_parallel = parser.parse() - - if prog_args.parse_only: - sys.exit(0) - - for context in Context.list: - context.deploy() - - runners = [] - if run_in_parallel: - for scenario in scenarios: - runner = run_one_scenario(scenario, prog_args.output_file) - runners.append(runner) - - # Wait for runners to finish - for runner in runners: - runner_join(runner) - print "Runner ended, output in", prog_args.output_file - else: - # run serially - for scenario in scenarios: - runner = run_one_scenario(scenario, prog_args.output_file) - runner_join(runner) - print "Runner ended, output in", prog_args.output_file - - if prog_args.keep_deploy: - # keep deployment, forget about stack (hide it for exit handler) - Context.list = [] - else: - for context in Context.list: - context.undeploy() - - print "Done, exiting" + YardstickCLI().main(sys.argv[1:]) if __name__ == '__main__': main() -- cgit 1.2.3-korg