Rewrite the HA test case (1) 07/4007/4
authorwym_libra <yimin.wang@huawei.com>
Mon, 7 Dec 2015 08:02:18 +0000 (16:02 +0800)
committerwym_libra <yimin.wang@huawei.com>
Fri, 18 Dec 2015 02:09:08 +0000 (10:09 +0800)
refactor the attacker implement.
1) BaseAttacker is added
2) a simple attacker named "kill-process" inherit the BaseAttacker
3) serviceha.py selects an attacker through the BaseAttacker by attacker name

JIRA: YARDSTICK-149

Change-Id: Ib718d5edc6b5e14bc3ea0592e0146468ff70b43e
Signed-off-by: wym_libra <yimin.wang@huawei.com>
13 files changed:
samples/serviceha.yaml
setup.py
tests/unit/benchmark/scenarios/availability/test_attacker_process.py [new file with mode: 0644]
tests/unit/benchmark/scenarios/availability/test_serviceha.py
yardstick/benchmark/scenarios/availability/attacker/__init__.py [new file with mode: 0755]
yardstick/benchmark/scenarios/availability/attacker/attacker_conf.yaml [new file with mode: 0644]
yardstick/benchmark/scenarios/availability/attacker/attacker_process.py [new file with mode: 0644]
yardstick/benchmark/scenarios/availability/attacker/baseattacker.py [new file with mode: 0644]
yardstick/benchmark/scenarios/availability/attacker/scripts/check_service.bash [moved from yardstick/benchmark/scenarios/availability/ha_tools/check_service.bash with 100% similarity]
yardstick/benchmark/scenarios/availability/attacker/scripts/start_service.bash [moved from yardstick/benchmark/scenarios/availability/ha_tools/start_service.bash with 100% similarity]
yardstick/benchmark/scenarios/availability/attacker/scripts/stop_service.bash [moved from yardstick/benchmark/scenarios/availability/ha_tools/stop_service.bash with 100% similarity]
yardstick/benchmark/scenarios/availability/ha_tools/ha_conf.yaml [deleted file]
yardstick/benchmark/scenarios/availability/serviceha.py

index 4247321..ce4fefa 100755 (executable)
@@ -7,15 +7,20 @@ scenarios:
 -
   type: ServiceHA
   options:
-    component: "nova-api"
-    fault_type: "stop-service"
-    fault_time: 5
+    attackers:
+    - fault_type: "kill-process"
+      process_name: "nova-api"
+      host: node1
 
-  host: node1.LF
+    monitors:
+    - monitor_cmd: "nova image-list"
+      monitor_time: 10
+  nodes:
+    node1: node1.LF
 
   runner:
     type: Duration
-    duration: 6
+    duration: 1
   sla:
     outage_time: 5
     action: monitor
index 495291c..654ea0f 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,8 @@ setup(
     include_package_data=True,
     package_data={
         'yardstick': [
-            'benchmark/scenarios/availability/ha_tools/*.bash',
+            'benchmark/scenarios/availability/attacker/*.yaml',
+            'benchmark/scenarios/availability/attacker/scripts/*.bash',
             'benchmark/scenarios/compute/*.bash',
             'benchmark/scenarios/networking/*.bash',
             'benchmark/scenarios/storage/*.bash',
diff --git a/tests/unit/benchmark/scenarios/availability/test_attacker_process.py b/tests/unit/benchmark/scenarios/availability/test_attacker_process.py
new file mode 100644 (file)
index 0000000..eb0cce7
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2015 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
+##############################################################################
+
+# Unittest for yardstick.benchmark.scenarios.availability.attacker.attacker_process
+
+import mock
+import unittest
+
+from yardstick.benchmark.scenarios.availability.attacker import baseattacker
+
+@mock.patch('yardstick.benchmark.scenarios.availability.attacker.attacker_process.ssh')
+class AttackerServiceTestCase(unittest.TestCase):
+
+    def setUp(self):
+        host = {
+            "ip": "10.20.0.5",
+            "user": "root",
+            "key_filename": "/root/.ssh/id_rsa"
+        }
+        self.context = {"node1": host}
+        self.attacker_cfg = {
+            'fault_type': 'kill-process',
+            'process_name': 'nova-api',
+            'host': 'node1',
+        }
+
+    def test__attacker_service_all_successful(self, mock_ssh):
+
+        cls = baseattacker.BaseAttacker.get_attacker_cls(self.attacker_cfg)
+        ins = cls(self.attacker_cfg, self.context)
+
+        mock_ssh.SSH().execute.return_value = (0, "running", '')
+        ins.setup()
+        ins.inject_fault()
+        ins.recover()
+
+    def test__attacker_service_check_failuer(self, mock_ssh):
+
+        cls = baseattacker.BaseAttacker.get_attacker_cls(self.attacker_cfg)
+        ins = cls(self.attacker_cfg, self.context)
+
+        mock_ssh.SSH().execute.return_value = (0, "error check", '')
+        ins.setup()
index 861bacd..32adf32 100644 (file)
@@ -16,138 +16,61 @@ import unittest
 
 from yardstick.benchmark.scenarios.availability import serviceha
 
-@mock.patch('yardstick.benchmark.scenarios.availability.serviceha.ssh')
+@mock.patch('yardstick.benchmark.scenarios.availability.serviceha.monitor')
+@mock.patch('yardstick.benchmark.scenarios.availability.serviceha.baseattacker')
 class ServicehaTestCase(unittest.TestCase):
 
     def setUp(self):
-        self.args = {
-            'options':{
-                'component':'nova-api',
-                'fault_type':'stop-service',
-                'fault_time':0
-            },
-            'sla':{
-                'outage_time':'2'
-            }
+        host = {
+            "ip": "10.20.0.5",
+            "user": "root",
+            "key_filename": "/root/.ssh/id_rsa"
         }
-        self.ctx = {
-            'host': {
-                'ip': '10.20.0.3',
-                'user': 'cirros',
-                'key_filename': 'mykey.key'
-            }
+        self.ctx = {"nodes": {"node1": host}}
+        attacker_cfg = {
+            "fault_type": "kill-process",
+            "process_name": "nova-api",
+            "host": "node1"
         }
+        attacker_cfgs = []
+        attacker_cfgs.append(attacker_cfg)
+        monitor_cfg = {
+            "monitor_cmd": "nova image-list",
+            "monitor_time": 0.1
+        }
+        monitor_cfgs = []
+        monitor_cfgs.append(monitor_cfg)
 
-    def test__serviceha_setup_successful(self, mock_ssh):
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'running', '')
-        p.setup()
-
-        self.assertEqual(p.setup_done, True)
-
-    def test__serviceha_setup_fail_service(self, mock_ssh):
-
-        self.args['options']['component'] = 'error'
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'running', '')
-        p.setup()
-
-        self.assertEqual(p.setup_done, False)
-
-    def test__serviceha_setup_fail_fault_type(self, mock_ssh):
-
-        self.args['options']['fault_type'] = 'error'
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'running', '')
-        p.setup()
-
-        self.assertEqual(p.setup_done, False)
-
-    def test__serviceha_setup_fail_check(self, mock_ssh):
-
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'error', '')
-        p.setup()
-
-        self.assertEqual(p.setup_done, False)
-
-    def test__serviceha_setup_fail_script(self, mock_ssh):
+        options = {
+            "attackers": attacker_cfgs,
+            "monitors": monitor_cfgs
+        }
+        sla = {"outage_time": 5}
+        self.args = {"options": options, "sla": sla}
 
+    def test__serviceha_setup_run_successful(self, mock_attacker, mock_monitor):
         p = serviceha.ServiceHA(self.args, self.ctx)
 
-        mock_ssh.SSH().execute.return_value = (-1, 'false', '')
-
-        self.assertRaises(RuntimeError, p.setup)
-        self.assertEqual(p.setup_done, False)
-
-    @mock.patch('yardstick.benchmark.scenarios.availability.serviceha.monitor')
-    def test__serviceha_run_successful(self, mock_monitor, mock_ssh):
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'running', '')
         p.setup()
-
-        monitor_result = {'total_time': 5, 'outage_time': 0, 'total_count': 16, 'outage_count': 0}
-        mock_monitor.Monitor().get_result.return_value = monitor_result
-
-        p.connection = mock_ssh.SSH()
-        mock_ssh.SSH().execute.return_value = (0, 'success', '')
+        self.assertEqual(p.setup_done, True)
 
         result = {}
-        p.run(result)
-        self.assertEqual(result,{ 'outage_time': 0})
+        result["outage_time"] = 0
+        mock_monitor.Monitor().get_result.return_value = result
+        ret = {}
+        p.run(ret)
+        self.assertEqual(ret, result)
+        p.teardown()
 
-    def test__serviceha_run_fail_nosetup(self, mock_ssh):
+    def test__serviceha_run_sla_error(self, mock_attacker, mock_monitor):
         p = serviceha.ServiceHA(self.args, self.ctx)
-        p.run(None)
 
-    @mock.patch('yardstick.benchmark.scenarios.availability.serviceha.monitor')
-    def test__serviceha_run_fail_script(self, mock_monitor, mock_ssh):
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'running', '')
         p.setup()
-
-        monitor_result = {'total_time': 5, 'outage_time': 0, 'total_count': 16, 'outage_count': 0}
-        mock_monitor.Monitor().get_result.return_value = monitor_result
-
-        p.connection = mock_ssh.SSH()
-        mock_ssh.SSH().execute.return_value = (-1, 'error', '')
-
-        result = {}
-        self.assertRaises(RuntimeError, p.run, result)
-
-    @mock.patch('yardstick.benchmark.scenarios.availability.serviceha.monitor')
-    def test__serviceha_run_fail_sla(self, mock_monitor, mock_ssh):
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'running', '')
-        p.setup()
-
-        monitor_result = {'total_time': 10, 'outage_time': 5, 'total_count': 16, 'outage_count': 0}
-        mock_monitor.Monitor().get_result.return_value = monitor_result
-
-        p.connection = mock_ssh.SSH()
-        mock_ssh.SSH().execute.return_value = (0, 'success', '')
+        self.assertEqual(p.setup_done, True)
 
         result = {}
-        self.assertRaises(AssertionError, p.run, result)
-
-    def test__serviceha_teardown_successful(self, mock_ssh):
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'running', '')
-        p.setup()
-        p.need_teardown = True
-
-        mock_ssh.SSH().execute.return_value = (0, 'success', '')
-        p.teardown()
-
-        self.assertEqual(p.need_teardown, False)
-
-    def test__serviceha_teardown_fail_script(self, mock_ssh):
-        p = serviceha.ServiceHA(self.args, self.ctx)
-        mock_ssh.SSH().execute.return_value = (0, 'running', '')
-        p.setup()
-        p.need_teardown = True
-
-        mock_ssh.SSH().execute.return_value = (-1, 'false', '')
-
-        self.assertRaises(RuntimeError, p.teardown)
+        result["outage_time"] = 10
+        mock_monitor.Monitor().get_result.return_value = result
 
+        ret = {}
+        self.assertRaises(AssertionError, p.run, ret)
diff --git a/yardstick/benchmark/scenarios/availability/attacker/__init__.py b/yardstick/benchmark/scenarios/availability/attacker/__init__.py
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/yardstick/benchmark/scenarios/availability/attacker/attacker_conf.yaml b/yardstick/benchmark/scenarios/availability/attacker/attacker_conf.yaml
new file mode 100644 (file)
index 0000000..44f0603
--- /dev/null
@@ -0,0 +1,9 @@
+---
+# sample config file for ha test
+#
+schema: "yardstick:task:0.1"
+
+kill-process:
+ inject_script: scripts/stop_service.bash
+ recovery_script: scripts/start_service.bash
+ check_script: scripts/check_service.bash
diff --git a/yardstick/benchmark/scenarios/availability/attacker/attacker_process.py b/yardstick/benchmark/scenarios/availability/attacker/attacker_process.py
new file mode 100644 (file)
index 0000000..5118ad6
--- /dev/null
@@ -0,0 +1,67 @@
+##############################################################################
+# Copyright (c) 2015 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 logging
+
+from baseattacker import BaseAttacker
+import yardstick.ssh as ssh
+
+LOG = logging.getLogger(__name__)
+
+
+class ProcessAttacker(BaseAttacker):
+
+    __attacker_type__ = 'kill-process'
+
+    def setup(self):
+        LOG.debug("config:%s context:%s" % (self._config, self._context))
+        host = self._context.get(self._config['host'], None)
+        ip = host.get("ip", None)
+        user = host.get("user", "root")
+        key_filename = host.get("key_filename", "~/.ssh/id_rsa")
+
+        self.connection = ssh.SSH(user, ip, key_filename=key_filename)
+        self.connection.wait(timeout=600)
+        LOG.debug("ssh host success!")
+
+        self.service_name = self._config['process_name']
+        self.fault_cfg = BaseAttacker.attacker_cfgs.get('kill-process')
+
+        self.check_script = self.get_script_fullpath(
+            self.fault_cfg['check_script'])
+        self.inject_script = self.get_script_fullpath(
+            self.fault_cfg['inject_script'])
+        self.recovery_script = self.get_script_fullpath(
+            self.fault_cfg['recovery_script'])
+
+        if self.check():
+            self.setup_done = True
+
+    def check(self):
+        exit_status, stdout, stderr = self.connection.execute(
+            "/bin/sh -s {0}".format(self.service_name),
+            stdin=open(self.check_script, "r"))
+
+        if stdout and "running" in stdout:
+            LOG.info("check the envrioment success!")
+            return True
+        else:
+            LOG.error(
+                "the host envrioment is error, stdout:%s, stderr:%s" %
+                (stdout, stderr))
+        return False
+
+    def inject_fault(self):
+        exit_status, stdout, stderr = self.connection.execute(
+            "/bin/sh -s {0}".format(self.service_name),
+            stdin=open(self.inject_script, "r"))
+
+    def recover(self):
+        exit_status, stdout, stderr = self.connection.execute(
+            "/bin/sh -s {0} ".format(self.service_name),
+            stdin=open(self.recovery_script, "r"))
diff --git a/yardstick/benchmark/scenarios/availability/attacker/baseattacker.py b/yardstick/benchmark/scenarios/availability/attacker/baseattacker.py
new file mode 100644 (file)
index 0000000..ddaf099
--- /dev/null
@@ -0,0 +1,47 @@
+##############################################################################
+# Copyright (c) 2015 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 pkg_resources
+import yaml
+import logging
+import os
+
+import yardstick.common.utils as utils
+
+LOG = logging.getLogger(__name__)
+
+attacker_conf_path = pkg_resources.resource_filename(
+    "yardstick.benchmark.scenarios.availability.attacker",
+    "attacker_conf.yaml")
+
+
+class BaseAttacker(object):
+
+    attacker_cfgs = {}
+
+    def __init__(self, config, context):
+        if not BaseAttacker.attacker_cfgs:
+            with open(attacker_conf_path) as stream:
+                BaseAttacker.attacker_cfgs = yaml.load(stream)
+
+        self._config = config
+        self._context = context
+        self.setup_done = False
+
+    @staticmethod
+    def get_attacker_cls(attacker_cfg):
+        '''return attacker instance of specified type'''
+        attacker_type = attacker_cfg['fault_type']
+        for attacker_cls in utils.itersubclasses(BaseAttacker):
+            if attacker_type == attacker_cls.__attacker_type__:
+                return attacker_cls
+        raise RuntimeError("No such runner_type %s" % attacker_type)
+
+    def get_script_fullpath(self, path):
+        base_path = os.path.dirname(attacker_conf_path)
+        return os.path.join(base_path, path)
diff --git a/yardstick/benchmark/scenarios/availability/ha_tools/ha_conf.yaml b/yardstick/benchmark/scenarios/availability/ha_tools/ha_conf.yaml
deleted file mode 100644 (file)
index 67e56eb..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
----
-# sample config file for ha test
-#
-schema: "yardstick:task:0.1"
-
-nova-api:
--
- type: stop-service
- inject_script: ha_tools/stop_service.bash
- recovery_script: ha_tools/start_service.bash
- check_script: ha_tools/check_service.bash
- monitor_cmd: nova image-list
index 3e03e1d..10134ea 100755 (executable)
@@ -6,13 +6,11 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-import pkg_resources
 import logging
 import time
-import yaml
-import yardstick.ssh as ssh
 from yardstick.benchmark.scenarios import base
 from yardstick.benchmark.scenarios.availability import monitor
+from yardstick.benchmark.scenarios.availability.attacker import baseattacker
 
 LOG = logging.getLogger(__name__)
 
@@ -22,87 +20,34 @@ class ServiceHA(base.Scenario):
     """
     __scenario_type__ = "ServiceHA"
 
-    HA_CONF = "ha_tools/ha_conf.yaml"
-
     def __init__(self, scenario_cfg, context_cfg):
+        LOG.debug(
+            "scenario_cfg:%s context_cfg:%s" %
+            (scenario_cfg, context_cfg))
         self.scenario_cfg = scenario_cfg
         self.context_cfg = context_cfg
-        self.service_name = scenario_cfg["options"]["component"]
-        self.fault_type = scenario_cfg["options"]["fault_type"]
-        self.fault_time = scenario_cfg["options"].get("fault_time", 0)
-        self.fault_cfg = None
         self.setup_done = False
-        self.need_teardown = False
 
     def setup(self):
         '''scenario setup'''
-        self.ha_conf_file = pkg_resources.resource_filename(
-            "yardstick.benchmark.scenarios.availability",
-            ServiceHA.HA_CONF)
-        ha_cfg = []
-        with open(self.ha_conf_file) as stream:
-                ha_cfg = yaml.load(stream)
-        LOG.debug("ha_cfg content:%s" % ha_cfg)
-
-        # check the ha_conf contains the service defined in test cases yaml
-        service_cfg = ha_cfg.get(self.service_name, None)
-        if not service_cfg:
-            LOG.error(
-                "The component %s can not be supported!" % self.service_name)
-            return
-
-        for fault in service_cfg:
-            if fault["type"] == self.fault_type:
-                self.fault_cfg = fault
-                break
-        if not self.fault_cfg:
-            LOG.error(
-                "The fualt_type %s can not be supproted!" % self.fault_type)
-            return
-        LOG.debug("the fault_cfg :%s" % self.fault_cfg)
-
-        self.fault_script = pkg_resources.resource_filename(
-            "yardstick.benchmark.scenarios.availability",
-            self.fault_cfg["inject_script"])
-        self.recovery_script = pkg_resources.resource_filename(
-            "yardstick.benchmark.scenarios.availability",
-            self.fault_cfg["recovery_script"])
-        self.check_script = pkg_resources.resource_filename(
-            "yardstick.benchmark.scenarios.availability",
-            self.fault_cfg["check_script"])
-
-        host = self.context_cfg.get("host", None)
-        ip = host.get("ip", None)
-        user = host.get("user", "root")
-        key_filename = host.get("key_filename", "~/.ssh/id_rsa")
-        LOG.info("The host: %s  the service: %s" % (ip, self.service_name))
-        LOG.debug("The params, host:%s  fault_cfg:%s" % (host, self.fault_cfg))
-
-        LOG.debug(
-            "ssh connection ip:%s, user:%s, key_file:%s",
-            ip, user, key_filename)
-        self.connection = ssh.SSH(user, ip, key_filename=key_filename)
-        self.connection.wait(timeout=600)
-        LOG.debug("ssh host success!")
-
-        # check the host envrioment
-        exit_status, stdout, stderr = self.connection.execute(
-            "/bin/sh -s {0}".format(self.service_name),
-            stdin=open(self.check_script, "r"))
-        LOG.info(
-            "the exit_status:%s stdout:%s stderr:%s" %
-            (exit_status, stdout, stderr))
-        if exit_status:
-            raise RuntimeError(stderr)
-
-        if stdout and "running" in stdout:
-            LOG.info("check the envrioment success!")
-        else:
-            LOG.error(
-                "the host envrioment is error, stdout:%s, stderr:%s" %
-                (stdout, stderr))
+        nodes = self.context_cfg.get("nodes", None)
+        if nodes is None:
+            LOG.error("the nodes info is none")
             return
-
+        self.attackers = []
+        attacker_cfgs = self.scenario_cfg["options"]["attackers"]
+        for attacker_cfg in attacker_cfgs:
+            attacker_cls = baseattacker.BaseAttacker.get_attacker_cls(
+                attacker_cfg)
+            attacker_ins = attacker_cls(attacker_cfg, nodes)
+            attacker_ins.setup()
+            self.attackers.append(attacker_ins)
+
+        monitor_cfgs = self.scenario_cfg["options"]["monitors"]
+
+        self.monitor_ins = monitor.Monitor()
+        self.monitor_ins.setup(monitor_cfgs[0])
+        self.monitor_ins.monitor_time = monitor_cfgs[0]["monitor_time"]
         self.setup_done = True
 
     def run(self, result):
@@ -111,27 +56,18 @@ class ServiceHA(base.Scenario):
             LOG.error("The setup not finished!")
             return
 
-        monitorInstance = monitor.Monitor()
-        monitorInstance.setup(self.fault_cfg)
-        monitorInstance.start()
+        self.monitor_ins.start()
         LOG.info("monitor start!")
 
-        LOG.info("Inject fault!")
-        exit_status, stdout, stderr = self.connection.execute(
-            "/bin/sh -s {0}".format(self.service_name),
-            stdin=open(self.fault_script, "r"))
-
-        if exit_status != 0:
-            monitorInstance.stop()
-            raise RuntimeError(stderr)
+        for attacker in self.attackers:
+            attacker.inject_fault()
 
-        self.need_teardown = True
-        time.sleep(self.fault_time)
+        time.sleep(self.monitor_ins.monitor_time)
 
-        monitorInstance.stop()
+        self.monitor_ins.stop()
         LOG.info("monitor stop!")
 
-        ret = monitorInstance.get_result()
+        ret = self.monitor_ins.get_result()
         LOG.info("The monitor result:%s" % ret)
         outage_time = ret.get("outage_time")
         result["outage_time"] = outage_time
@@ -146,34 +82,36 @@ class ServiceHA(base.Scenario):
 
     def teardown(self):
         '''scenario teardown'''
-        LOG.info("recory the everiment!")
-
-        if self.need_teardown:
-            exit_status, stdout, stderr = self.connection.execute(
-                "/bin/sh -s {0} ".format(self.service_name),
-                stdin=open(self.recovery_script, "r"))
+        for attacker in self.attackers:
+            if not attacker.check():
+                attacker.recover()
 
-            if exit_status:
-                raise RuntimeError(stderr)
-            else:
-                self.need_teardown = False
 
-"""
-def _test():
+def _test():    # pragma: no cover
     '''internal test function'''
     host = {
         "ip": "10.20.0.5",
         "user": "root",
         "key_filename": "/root/.ssh/id_rsa"
     }
-    ctx = {"host": host}
-
-    logger = logging.getLogger("yardstick")
-    logger.setLevel(logging.DEBUG)
+    ctx = {"nodes": {"node1": host}}
+    attacker_cfg = {
+        "fault_type": "kill-process",
+        "process_name": "nova-api",
+        "host": "node1"
+    }
+    attacker_cfgs = []
+    attacker_cfgs.append(attacker_cfg)
+    monitor_cfg = {
+        "monitor_cmd": "nova image-list",
+        "monitor_tme": 10
+    }
+    monitor_cfgs = []
+    monitor_cfgs.append(monitor_cfg)
 
     options = {
-        "component": "nova-api",
-        "fault_type": "stop-service"
+        "attackers": attacker_cfgs,
+        "monitors": monitor_cfgs
     }
     sla = {"outage_time": 5}
     args = {"options": options, "sla": sla}
@@ -188,6 +126,5 @@ def _test():
 
     terstInstance.teardown()
 
-if __name__ == '__main__':
+if __name__ == '__main__':    # pragma: no cover
     _test()
-"""