Merge "Update yardstick framework architecture in userguide"
[yardstick.git] / yardstick / cmd / cli.py
index 8d75d7d..79f66e5 100644 (file)
@@ -7,10 +7,11 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-'''
+"""
 Command-line interface to yardstick
-'''
+"""
 
+from __future__ import absolute_import
 import logging
 import os
 import sys
@@ -19,20 +20,21 @@ from pkg_resources import get_distribution
 from argparse import RawDescriptionHelpFormatter
 from oslo_config import cfg
 
+from yardstick import _init_logging, _LOG_STREAM_HDLR
 from yardstick.cmd.commands import task
 from yardstick.cmd.commands import runner
 from yardstick.cmd.commands import scenario
+from yardstick.cmd.commands import testcase
+from yardstick.cmd.commands import plugin
+from yardstick.cmd.commands import env
+from yardstick.cmd.commands import report
 
 CONF = cfg.CONF
 cli_opts = [
     cfg.BoolOpt('debug',
                 short='d',
                 default=False,
-                help='increase output verbosity to debug'),
-    cfg.BoolOpt('verbose',
-                short='v',
-                default=False,
-                help='increase output verbosity to info')
+                help='increase output verbosity to debug')
 ]
 CONF.register_cli_opts(cli_opts)
 
@@ -52,21 +54,26 @@ def find_config_files(path_list):
 
 
 class YardstickCLI():
-    '''Command-line interface to yardstick'''
+    """Command-line interface to yardstick"""
 
     # Command categories
     categories = {
         'task': task.TaskCommands,
         'runner': runner.RunnerCommands,
-        'scenario': scenario.ScenarioCommands
+        'scenario': scenario.ScenarioCommands,
+        'testcase': testcase.TestcaseCommands,
+        'plugin': plugin.PluginCommands,
+        'env': env.EnvCommand,
+        'report': report.ReportCommands
     }
 
     def __init__(self):
+        self.opts = []
         self._version = 'yardstick version %s ' % \
             get_distribution('yardstick').version
 
     def _find_actions(self, subparsers, actions_module):
-        '''find action methods'''
+        """find action methods"""
         # Find action methods inside actions_module and
         # add them to the command parser.
         # The 'actions_module' argument may be a class
@@ -85,7 +92,7 @@ class YardstickCLI():
             subparser.set_defaults(func=callback)
 
     def _add_command_parsers(self, categories, subparsers):
-        '''add commands to command-line parser'''
+        """add commands to command-line parser"""
         for category in categories:
             command_object = categories[category]()
             desc = command_object.__doc__ or ''
@@ -97,8 +104,7 @@ class YardstickCLI():
             cmd_subparsers = subparser.add_subparsers(title='subcommands')
             self._find_actions(cmd_subparsers, command_object)
 
-    def main(self, argv):
-        '''run the command line interface'''
+    def _register_cli_opt(self):
 
         # register subcommands to parse additional command line arguments
         def parser(subparsers):
@@ -108,22 +114,64 @@ class YardstickCLI():
                                          title="Command categories",
                                          help="Available categories",
                                          handler=parser)
-        CONF.register_cli_opt(category_opt)
+        self._register_opt(category_opt)
+
+    def _register_opt(self, opt):
+
+        CONF.register_cli_opt(opt)
+        self.opts.append(opt)
+
+    def _load_cli_config(self, argv):
 
         # load CLI args and config files
         CONF(argv, project="yardstick", version=self._version,
              default_config_files=find_config_files(CONFIG_SEARCH_PATHS))
 
-        # handle global opts
-        logger = logging.getLogger('yardstick')
-        logger.setLevel(logging.WARNING)
-
-        if CONF.verbose:
-            logger.setLevel(logging.INFO)
+    def _handle_global_opts(self):
 
+        _init_logging()
         if CONF.debug:
-            logger.setLevel(logging.DEBUG)
+            _LOG_STREAM_HDLR.setLevel(logging.DEBUG)
+
+    def _dispath_func_notask(self):
 
         # dispatch to category parser
         func = CONF.category.func
         func(CONF.category)
+
+    def _dispath_func_task(self, task_id):
+
+        # dispatch to category parser
+        func = CONF.category.func
+        func(CONF.category, task_id=task_id)
+
+    def _clear_config_opts(self):
+
+        CONF.clear()
+        CONF.unregister_opts(self.opts)
+
+    def main(self, argv):    # pragma: no cover
+        """run the command line interface"""
+        try:
+            self._register_cli_opt()
+
+            self._load_cli_config(argv)
+
+            self._handle_global_opts()
+
+            self._dispath_func_notask()
+        finally:
+            self._clear_config_opts()
+
+    def api(self, argv, task_id):    # pragma: no cover
+        """run the api interface"""
+        try:
+            self._register_cli_opt()
+
+            self._load_cli_config(argv)
+
+            self._handle_global_opts()
+
+            self._dispath_func_task(task_id)
+        finally:
+            self._clear_config_opts()