Adding support for multi-dispatcher 93/36193/6
authorDeepak S <deepak.s@linux.intel.com>
Mon, 19 Jun 2017 12:19:41 +0000 (12:19 +0000)
committerRoss Brattain <ross.b.brattain@intel.com>
Thu, 27 Jul 2017 07:57:37 +0000 (07:57 +0000)
JIRA: YARDSTICK-684

This patch adds the support to enable multi-dispatcher of result.

e.g.
[DEFAULT]
debug = False
dispatcher = file, http

Change-Id: Id0e1a1bba14edd899fcf5b275be1f0a091b6db77
Signed-off-by: Deepak S <deepak.s@linux.intel.com>
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
etc/yardstick/yardstick.conf.sample
tests/unit/benchmark/core/test_task.py
yardstick/benchmark/core/task.py
yardstick/dispatcher/base.py

index 5720511..1157b9d 100644 (file)
@@ -9,7 +9,7 @@
 
 [DEFAULT]
 debug = False
-dispatcher = http
+dispatcher = http # setup multiple dipatcher with comma deperted e.g. file,http
 
 [dispatcher_http]
 timeout = 5
index 8d6d963..7f61753 100644 (file)
@@ -47,6 +47,20 @@ class TaskTestCase(unittest.TestCase):
         self.assertEqual(context_cfg["host"], server_info)
         self.assertEqual(context_cfg["target"], server_info)
 
+    def test_set_dispatchers(self):
+        t = task.Task()
+        output_config = {"DEFAULT": {"dispatcher": "file, http"}}
+        t._set_dispatchers(output_config)
+        self.assertEqual(output_config, output_config)
+
+    @mock.patch('yardstick.benchmark.core.task.DispatcherBase')
+    def test__do_output(self, mock_dispatcher):
+        t = task.Task()
+        output_config = {"DEFAULT": {"dispatcher": "file, http"}}
+        mock_dispatcher.get = mock.MagicMock(return_value=[mock.MagicMock(),
+                                                           mock.MagicMock()])
+        self.assertEqual(None, t._do_output(output_config, {}))
+
     @mock.patch('yardstick.benchmark.core.task.Context')
     def test_parse_networks_from_nodes(self, mock_context):
         nodes = {
index ede14b1..b2da7a2 100644 (file)
@@ -48,6 +48,12 @@ class Task(object):     # pragma: no cover
         self.contexts = []
         self.outputs = {}
 
+    def _set_dispatchers(self, output_config):
+        dispatchers = output_config.get('DEFAULT', {}).get('dispatcher',
+                                                           'file')
+        out_types = [s.strip() for s in dispatchers.split(',')]
+        output_config['DEFAULT']['dispatcher'] = out_types
+
     def start(self, args, **kwargs):
         """Start a benchmark scenario."""
 
@@ -68,7 +74,10 @@ class Task(object):     # pragma: no cover
         self._set_output_config(output_config, args.output_file)
         LOG.debug('Output configuration is: %s', output_config)
 
-        if output_config['DEFAULT'].get('dispatcher') == 'file':
+        self._set_dispatchers(output_config)
+
+        # update dispatcher list
+        if 'file' in output_config['DEFAULT']['dispatcher']:
             result = {'status': 0, 'result': {}}
             utils.write_json_to_file(args.output_file, result)
 
@@ -198,9 +207,10 @@ class Task(object):     # pragma: no cover
             return 'PASS'
 
     def _do_output(self, output_config, result):
+        dispatchers = DispatcherBase.get(output_config)
 
-        dispatcher = DispatcherBase.get(output_config)
-        dispatcher.flush_result_data(result)
+        for dispatcher in dispatchers:
+            dispatcher.flush_result_data(result)
 
     def _run(self, scenarios, run_in_parallel, output_file):
         """Deploys context and calls runners"""
index e77249c..1fc0a2f 100644 (file)
@@ -41,9 +41,11 @@ class Base(object):
     def get(config):
         """Returns instance of a dispatcher for dispatcher type.
         """
-        out_type = config['DEFAULT']['dispatcher']
+        list_dispatcher = \
+            [Base.get_cls(out_type.capitalize())(config)
+             for out_type in config['DEFAULT']['dispatcher']]
 
-        return Base.get_cls(out_type.capitalize())(config)
+        return list_dispatcher
 
     @abc.abstractmethod
     def flush_result_data(self, data):