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
18 LOG = logging.getLogger(__name__)
20 monitor_conf_path = pkg_resources.resource_filename(
21 "yardstick.benchmark.scenarios.availability",
25 class MonitorMgr(object):
26 """docstring for MonitorMgr"""
29 self._monitor_list = []
31 def init_monitors(self, monitor_cfgs, context):
32 LOG.debug("monitorMgr config: %s", monitor_cfgs)
34 for monitor_cfg in monitor_cfgs:
35 monitor_type = monitor_cfg["monitor_type"]
36 monitor_cls = BaseMonitor.get_monitor_cls(monitor_type)
37 monitor_ins = monitor_cls(monitor_cfg, context)
38 if "key" in monitor_cfg:
39 monitor_ins.key = monitor_cfg["key"]
40 self._monitor_list.append(monitor_ins)
42 def __getitem__(self, item):
43 for obj in self._monitor_list:
46 raise KeyError("No such monitor instance of key - %s" % item)
48 def start_monitors(self):
49 for _monotor_instace in self._monitor_list:
50 _monotor_instace.start_monitor()
52 def wait_monitors(self):
53 for monitor in self._monitor_list:
54 monitor.wait_monitor()
58 for monitor in self._monitor_list:
59 sla_pass = sla_pass & monitor.verify_SLA()
63 class BaseMonitor(multiprocessing.Process):
64 """docstring for BaseMonitor"""
67 def __init__(self, config, context):
68 if not BaseMonitor.monitor_cfgs:
69 with open(monitor_conf_path) as stream:
70 BaseMonitor.monitor_cfgs = yaml.load(stream)
71 multiprocessing.Process.__init__(self)
73 self._context = context
74 self._queue = multiprocessing.Queue()
75 self._event = multiprocessing.Event()
76 self.setup_done = False
79 def get_monitor_cls(monitor_type):
80 """return monitor class of specified type"""
82 for monitor in utils.itersubclasses(BaseMonitor):
83 if monitor_type == monitor.__monitor_type__:
85 raise RuntimeError("No such monitor_type %s" % monitor_type)
87 def get_script_fullpath(self, path):
88 base_path = os.path.dirname(monitor_conf_path)
89 return os.path.join(base_path, path)
92 LOG.debug("config:%s context:%s", self._config, self._context)
95 monitor_time = self._config.get("monitor_time", 0)
104 begin_time = time.time()
106 total_count = total_count + 1
108 one_check_begin_time = time.time()
109 exit_status = self.monitor_func()
110 one_check_end_time = time.time()
112 if exit_status is False:
113 outage_count = outage_count + 1
115 outage_time = outage_time + (
116 one_check_end_time - one_check_begin_time)
119 first_outage = one_check_begin_time
121 last_outage = one_check_end_time
123 if self._event.is_set():
124 LOG.debug("the monitor process stop")
127 if one_check_end_time - begin_time > monitor_time:
128 LOG.debug("the monitor max_time finished and exit!")
131 end_time = time.time()
132 total_time = end_time - begin_time
134 self._queue.put({"total_time": total_time,
135 "outage_time": last_outage - first_outage,
136 "total_count": total_count,
137 "outage_count": outage_count})
139 def start_monitor(self):
142 def wait_monitor(self):
144 self._result = self._queue.get()
145 LOG.debug("the monitor result:%s", self._result)
147 def setup(self): # pragma: no cover
150 def monitor_func(self): # pragma: no cover
153 def verify_SLA(self):