1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd. and others
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9 from __future__ import absolute_import
12 import multiprocessing
15 import yardstick.common.utils as utils
17 from yardstick.common.yaml_loader import yaml_load
19 LOG = logging.getLogger(__name__)
21 monitor_conf_path = pkg_resources.resource_filename(
22 "yardstick.benchmark.scenarios.availability",
26 class MonitorMgr(object):
27 """docstring for MonitorMgr"""
29 def __init__(self, data):
30 self._monitor_list = []
31 self.monitor_mgr_data = data
33 def init_monitors(self, monitor_cfgs, context):
34 LOG.debug("monitorMgr config: %s", monitor_cfgs)
36 for monitor_cfg in monitor_cfgs:
37 monitor_type = monitor_cfg["monitor_type"]
38 monitor_cls = BaseMonitor.get_monitor_cls(monitor_type)
40 monitor_number = monitor_cfg.get("monitor_number", 1)
41 if monitor_number > 1:
42 monitor_cls = BaseMonitor.get_monitor_cls("multi-monitor")
44 monitor_ins = monitor_cls(monitor_cfg, context,
45 self.monitor_mgr_data)
46 if "key" in monitor_cfg:
47 monitor_ins.tag = monitor_ins.key = monitor_cfg["key"]
48 elif monitor_type == "openstack-cmd":
49 monitor_ins.tag = monitor_cfg["command_name"].replace(" ", "-")
50 elif monitor_type == "process":
51 monitor_ins.tag = monitor_type + "_" + monitor_cfg["process_name"]
52 self._monitor_list.append(monitor_ins)
54 def __getitem__(self, item):
55 for obj in self._monitor_list:
58 raise KeyError("No such monitor instance of key - %s" % item)
60 def start_monitors(self):
61 for _monotor_instace in self._monitor_list:
62 _monotor_instace.start_monitor()
64 def wait_monitors(self):
65 for monitor in self._monitor_list:
66 monitor.wait_monitor()
70 for monitor in self._monitor_list:
71 sla_pass = sla_pass & monitor.verify_SLA()
74 def store_result(self, result):
75 for monitor in self._monitor_list:
76 monitor_result = monitor.get_result()
77 for k, v in monitor_result.items():
78 result[monitor.tag + "_" + k] = v
81 class BaseMonitor(multiprocessing.Process):
82 """docstring for BaseMonitor"""
85 def __init__(self, config, context, data):
86 if not BaseMonitor.monitor_cfgs:
87 with open(monitor_conf_path) as stream:
88 BaseMonitor.monitor_cfgs = yaml_load(stream)
89 multiprocessing.Process.__init__(self)
91 self._context = context
92 self._queue = multiprocessing.Queue()
93 self._event = multiprocessing.Event()
94 self.monitor_data = data
95 self.setup_done = False
97 self.intermediate_variables = {}
100 def get_monitor_cls(monitor_type):
101 """return monitor class of specified type"""
103 for monitor in utils.itersubclasses(BaseMonitor):
104 if monitor_type == monitor.__monitor_type__:
106 raise RuntimeError("No such monitor_type %s" % monitor_type)
108 def get_script_fullpath(self, path):
109 base_path = os.path.dirname(monitor_conf_path)
110 return os.path.join(base_path, path)
113 LOG.debug("config:%s context:%s", self._config, self._context)
116 monitor_time = self._config.get("monitor_time", 0)
125 begin_time = time.time()
127 total_count = total_count + 1
129 one_check_begin_time = time.time()
130 exit_status = self.monitor_func()
131 one_check_end_time = time.time()
133 if exit_status is False:
134 outage_count = outage_count + 1
136 outage_time = outage_time + (
137 one_check_end_time - one_check_begin_time)
140 first_outage = one_check_begin_time
142 last_outage = one_check_end_time
144 if self._event.is_set():
145 LOG.debug("the monitor process stop")
148 if one_check_end_time - begin_time > monitor_time:
149 LOG.debug("the monitor max_time finished and exit!")
152 end_time = time.time()
153 total_time = end_time - begin_time
155 self._queue.put({"total_time": total_time,
156 "outage_time": last_outage - first_outage,
157 "last_outage": last_outage,
158 "first_outage": first_outage,
159 "total_count": total_count,
160 "outage_count": outage_count})
162 def start_monitor(self):
165 def wait_monitor(self):
167 self._result = self._queue.get()
168 LOG.debug("the monitor result:%s", self._result)
170 def setup(self): # pragma: no cover
173 def monitor_func(self): # pragma: no cover
176 def verify_SLA(self):
179 def get_result(self):