add main cmd for yardstick 39/639/1
authorHans Feldt <hans.feldt@ericsson.com>
Fri, 22 May 2015 12:01:37 +0000 (14:01 +0200)
committerHans Feldt <hans.feldt@ericsson.com>
Fri, 22 May 2015 12:18:13 +0000 (14:18 +0200)
Some necessary setup fixes (after the pbr 1.0.1 release)

JIRA: -
Change-Id: I6259f7211b2f446e57461b7b6ac0e42387b92f5c
Signed-off-by: Hans Feldt <hans.feldt@ericsson.com>
setup.py
yardstick/main.py [new file with mode: 0755]

index 8c16c56..6881851 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -5,13 +5,14 @@ ez_setup.use_setuptools()
 
 setup(
     name="yardstick",
-    version="0.1dev",
+    version="0.1.dev0",
     packages=find_packages(),
-    scripts=['bin/yardstick'],
     include_package_data=True,
+    package_data={'yardstick': ['benchmark/scenarios/networking/*.bash']},
     url="https://www.opnfv.org",
     install_requires=["flake8",
                       "PyYAML>=3.10",
+                      "pbr!=0.7,<1.0,>=0.6",
                       "python-glanceclient>=0.12.0",
                       "python-heatclient>=0.2.12",
                       "python-keystoneclient>=0.11.1",
@@ -21,4 +22,9 @@ setup(
                       "paramiko",
                       "six"
                       ],
+    entry_points = {
+        'console_scripts': [
+            'yardstick=yardstick.main:main',
+        ],
+    }
 )
diff --git a/yardstick/main.py b/yardstick/main.py
new file mode 100755 (executable)
index 0000000..f270bf9
--- /dev/null
@@ -0,0 +1,133 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2015 Ericsson AB 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
+##############################################################################
+
+""" yardstick - command line tool for managing benchmarks
+
+    Example invocation:
+    $ yardstick samples/ping-task.yaml
+"""
+
+import sys
+import yaml
+import atexit
+import pkg_resources
+
+from yardstick.benchmark.context.model import Context
+from yardstick.benchmark.runners import base as base_runner
+from yardstick.cmdparser import CmdParser
+from yardstick.orchestrator.heat import HeatStack
+
+
+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"]))
+        context = Context()
+        context.init(cfg["context"])
+
+        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, context
+
+
+def atexit_handler():
+    '''handler for process termination'''
+    if HeatStack.stacks_exist():
+        print "Deleting all stacks"
+    HeatStack.delete_all()
+
+
+def run_one_scenario(scenario_cfg, context, 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.floating_ip["ipaddr"]
+    runner_cfg['user'] = context.user
+    runner_cfg['key_filename'] = key_filename
+    runner_cfg['output_filename'] = output_file
+
+    target = context.get_server(scenario_cfg["target"])
+    if target.floating_ip:
+        runner_cfg['target'] = target.floating_ip["ipaddr"]
+
+    # TODO hardcoded name below, a server can be attached to several nets
+    scenario_cfg["ipaddr"] = target.ports["test"]["ipaddr"]
+
+    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 main():
+    '''yardstick main'''
+
+    atexit.register(atexit_handler)
+
+    prog_args = CmdParser().parse_args()
+
+    parser = TaskParser(prog_args.taskfile[0])
+    scenarios, run_in_parallel, context = parser.parse()
+
+    if prog_args.parse_only:
+        sys.exit(0)
+
+    context.deploy()
+
+    runners = []
+    if run_in_parallel:
+        for scenario in scenarios:
+            runner = run_one_scenario(scenario, context, prog_args.output_file)
+            runners.append(runner)
+
+        # Wait for runners to finish
+        for runner in runners:
+            runner.join()
+            print "Runner ended, output in", prog_args.output_file
+            base_runner.Runner.release(runner)
+    else:
+        # run serially
+        for scenario in scenarios:
+            runner = run_one_scenario(scenario, context, prog_args.output_file)
+            runner.join()
+            print "Runner ended, output in", prog_args.output_file
+            base_runner.Runner.release(runner)
+
+    if prog_args.keep_deploy:
+        # keep deployment, forget about stack (hide it for exit handler)
+        context.stack = None
+    else:
+        context.undeploy()
+
+    print "Done, exiting"
+
+if __name__ == '__main__':
+    main()