From 747a3260fef52fb5f7da337bc149ec202a05be6e Mon Sep 17 00:00:00 2001 From: LiHuan Date: Fri, 7 Apr 2017 23:32:07 +0800 Subject: Add a new monitor type: MultiMonitor that can run any number of other monitors at the same time. JIRA: YARDSTICK-397 Change-Id: Ic5cb79f0820029e306373abead1ea43fac9abee2 Signed-off-by: HuanLi --- .../scenarios/availability/test_monitor_multi.py | 61 +++++++++++++++++++ .../scenarios/availability/monitor/basemonitor.py | 10 ++++ .../availability/monitor/monitor_multi.py | 68 ++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 tests/unit/benchmark/scenarios/availability/test_monitor_multi.py create mode 100644 yardstick/benchmark/scenarios/availability/monitor/monitor_multi.py diff --git a/tests/unit/benchmark/scenarios/availability/test_monitor_multi.py b/tests/unit/benchmark/scenarios/availability/test_monitor_multi.py new file mode 100644 index 000000000..9539f27d0 --- /dev/null +++ b/tests/unit/benchmark/scenarios/availability/test_monitor_multi.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +############################################################################## +# Copyright (c) 2016 Huan Li and others +# lihuansse@tongji.edu.cn +# 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.monitor +# .monitor_multi + +from __future__ import absolute_import +import mock +import unittest +from yardstick.benchmark.scenarios.availability.monitor import monitor_multi + +@mock.patch('yardstick.benchmark.scenarios.availability.monitor.' + 'monitor_general.ssh') +@mock.patch('yardstick.benchmark.scenarios.availability.monitor.' + 'monitor_general.open') +class MultiMonitorServiceTestCase(unittest.TestCase): + + def setUp(self): + host = { + "ip": "10.20.0.5", + "user": "root", + "key_filename": "/root/.ssh/id_rsa" + } + self.context = {"node1": host} + self.monitor_cfg = { + 'monitor_type': 'general-monitor', + 'monitor_number': 3, + 'key': 'service-status', + 'monitor_key': 'service-status', + 'host': 'node1', + 'monitor_time': 3, + 'parameter': {'serviceName': 'haproxy'}, + 'sla': {'max_outage_time': 1} + } + + def test__monitor_multi_all_successful(self, mock_open, mock_ssh): + ins = monitor_multi.MultiMonitor(self.monitor_cfg, self.context); + + mock_ssh.SSH().execute.return_value = (0, "running", '') + + ins.start_monitor(); + ins.wait_monitor(); + ins.verify_SLA() + + def test__monitor_multi_all_fail(self, mock_open, mock_ssh): + ins = monitor_multi.MultiMonitor(self.monitor_cfg, self.context); + + mock_ssh.SSH().execute.return_value = (1, "failed", '') + + ins.start_monitor(); + ins.wait_monitor(); + ins.verify_SLA() + diff --git a/yardstick/benchmark/scenarios/availability/monitor/basemonitor.py b/yardstick/benchmark/scenarios/availability/monitor/basemonitor.py index 3062037ee..a0fc5965b 100644 --- a/yardstick/benchmark/scenarios/availability/monitor/basemonitor.py +++ b/yardstick/benchmark/scenarios/availability/monitor/basemonitor.py @@ -34,6 +34,11 @@ class MonitorMgr(object): for monitor_cfg in monitor_cfgs: monitor_type = monitor_cfg["monitor_type"] monitor_cls = BaseMonitor.get_monitor_cls(monitor_type) + + monitor_number = monitor_cfg.get("monitor_number", 1) + if monitor_number > 1: + monitor_cls = BaseMonitor.get_monitor_cls("multi-monitor") + monitor_ins = monitor_cls(monitor_cfg, context) if "key" in monitor_cfg: monitor_ins.key = monitor_cfg["key"] @@ -133,6 +138,8 @@ class BaseMonitor(multiprocessing.Process): self._queue.put({"total_time": total_time, "outage_time": last_outage - first_outage, + "last_outage": last_outage, + "first_outage": first_outage, "total_count": total_count, "outage_count": outage_count}) @@ -152,3 +159,6 @@ class BaseMonitor(multiprocessing.Process): def verify_SLA(self): pass + + def result(self): + return self._result diff --git a/yardstick/benchmark/scenarios/availability/monitor/monitor_multi.py b/yardstick/benchmark/scenarios/availability/monitor/monitor_multi.py new file mode 100644 index 000000000..8df2ea282 --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/monitor/monitor_multi.py @@ -0,0 +1,68 @@ +############################################################################## +# Copyright (c) 2017 Huan Li and others +# lihuansse@tongji.edu.cn +# 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 +############################################################################## + +from __future__ import absolute_import +import logging +import time + +from yardstick.benchmark.scenarios.availability.monitor import basemonitor + +LOG = logging.getLogger(__name__) + + +class MultiMonitor(basemonitor.BaseMonitor): + + __monitor_type__ = "multi-monitor" + + def __init__(self, config, context): + super(MultiMonitor, self).__init__(config, context) + + self.monitors = [] + monitor_type = self._config["monitor_type"] + monitor_cls = basemonitor.BaseMonitor.get_monitor_cls(monitor_type) + + monitor_number = self._config.get("monitor_number", 1) + for i in range(monitor_number): + monitor_ins = monitor_cls(self._config, self._context) + self.monitors.append(monitor_ins) + + def start_monitor(self): + for monitor in self.monitors: + monitor.start_monitor() + + def wait_monitor(self): + for monitor in self.monitors: + monitor.wait_monitor() + + def verify_SLA(self): + first_outage = time.time() + last_outage = 0 + + for monitor in self.monitors: + monitor_result = monitor.result() + monitor_first_outage = monitor_result.get('first_outage', None) + monitor_last_outage = monitor_result.get('last_outage', None) + + if monitor_first_outage is None or monitor_last_outage is None: + continue + + if monitor_first_outage < first_outage: + first_outage = monitor_first_outage + + if monitor_last_outage > last_outage: + last_outage = monitor_last_outage + LOG.debug("multi monitor result: %f , %f", first_outage, last_outage) + + outage_time = last_outage - first_outage + max_outage_time = self._config["sla"]["max_outage_time"] + if outage_time > max_outage_time: + LOG.error("SLA failure: %f > %f", outage_time, max_outage_time) + return False + else: + return True -- cgit 1.2.3-korg