diff options
author | Ross Brattain <ross.b.brattain@intel.com> | 2017-09-28 00:10:43 -0700 |
---|---|---|
committer | Ross Brattain <ross.b.brattain@intel.com> | 2017-10-03 11:02:09 -0700 |
commit | 6801867b535eacb87197acee026b6c243c86e94e (patch) | |
tree | 414cc01fd70b933628cbe31b1e9ae5bcd8fb897d /yardstick/network_services | |
parent | ed22407293b92ca3e51e0230b5c3bf7bc4bb168b (diff) |
add collectd resource node capability
allow manually adding collectd nodes using Node context.
if a node is present with a collectd config dict then
we can create a ResourceProfile object for it
and connect to collectd.
example
nodes:
-
name: compute_0
role: Compute
ip: 1.1.1.1
user: root
password: r00t
collectd:
interval: 5
plugins:
ovs_stats: {}
Change-Id: Ie0c00fdb58373206071daa1fb13faf175c4313e0
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
Diffstat (limited to 'yardstick/network_services')
-rw-r--r-- | yardstick/network_services/collector/subscriber.py | 59 | ||||
-rw-r--r-- | yardstick/network_services/nfvi/resource.py | 16 |
2 files changed, 65 insertions, 10 deletions
diff --git a/yardstick/network_services/collector/subscriber.py b/yardstick/network_services/collector/subscriber.py index 3bcb20876..db52e0b45 100644 --- a/yardstick/network_services/collector/subscriber.py +++ b/yardstick/network_services/collector/subscriber.py @@ -12,28 +12,73 @@ # See the License for the specific language governing permissions and # limitations under the License. """This module implements stub for publishing results in yardstick format.""" +import logging + +from yardstick.network_services.nfvi.resource import ResourceProfile +from yardstick.network_services.utils import get_nsb_option + +LOG = logging.getLogger(__name__) class Collector(object): """Class that handles dictionary of results in yardstick-plot format.""" - def __init__(self, traffic_profile, vnfs): + @staticmethod + def make_resource_profile(node, timeout): + # node dict works as mgmt dict + # don't need port names, there is no way we can + # tell what port is used on the compute node + collectd_options = node["collectd"] + plugins = collectd_options.get("plugins", {}) + interval = collectd_options.get("interval") + + # use default cores = None to MatchAllCores + return ResourceProfile(node, plugins=plugins, interval=interval, timeout=timeout) + + def __init__(self, vnfs, nodes, traffic_profile, timeout=3600): super(Collector, self).__init__() self.traffic_profile = traffic_profile - self.service = vnfs + self.vnfs = vnfs + self.nodes = nodes + self.timeout = timeout + self.bin_path = get_nsb_option('bin_path', '') + self.resource_profiles = {node_name: self.make_resource_profile(node, self.timeout) + for node_name, node in self.nodes.items() + if node.get("collectd")} def start(self): """Nothing to do, yet""" - pass + for resource in self.resource_profiles.values(): + resource.initiate_systemagent(self.bin_path) + resource.start() + resource.amqp_process_for_nfvi_kpi() def stop(self): """Nothing to do, yet""" - pass + for resource in self.resource_profiles.values(): + resource.stop() - @classmethod - def get_kpi(cls, vnf): + def get_kpi(self): """Returns dictionary of results in yardstick-plot format :return: """ - return {vnf.name: vnf.collect_kpi()} + results = {} + for vnf in self.vnfs: + # Result example: + # {"VNF1: { "tput" : [1000, 999] }, "VNF2": { "latency": 100 }} + LOG.debug("collect KPI for %s", vnf.name) + results[vnf.name] = vnf.collect_kpi() + + for node_name, resource in self.resource_profiles.items(): + # Result example: + # {"VNF1: { "tput" : [1000, 999] }, "VNF2": { "latency": 100 }} + LOG.debug("collect KPI for %s", node_name) + if not resource.check_if_sa_running("collectd")[0]: + continue + + try: + results[node_name] = {"core": resource.amqp_collect_nfvi_kpi()} + except Exception: + LOG.exception("") + return results diff --git a/yardstick/network_services/nfvi/resource.py b/yardstick/network_services/nfvi/resource.py index d807f5e46..7e8334c73 100644 --- a/yardstick/network_services/nfvi/resource.py +++ b/yardstick/network_services/nfvi/resource.py @@ -51,16 +51,26 @@ class ResourceProfile(object): COLLECTD_CONF = "collectd.conf" AMPQ_PORT = 5672 DEFAULT_INTERVAL = 25 + DEFAULT_TIMEOUT = 3600 + + def __init__(self, mgmt, port_names=None, cores=None, plugins=None, + interval=None, timeout=None): - def __init__(self, mgmt, port_names=None, cores=None, plugins=None, interval=None): if plugins is None: self.plugins = {} else: self.plugins = plugins + if interval is None: self.interval = self.DEFAULT_INTERVAL else: self.interval = interval + + if timeout is None: + self.timeout = self.DEFAULT_TIMEOUT + else: + self.timeout = timeout + self.enable = True self.cores = validate_non_string_sequence(cores, default=[]) self._queue = multiprocessing.Queue() @@ -73,8 +83,8 @@ class ResourceProfile(object): def check_if_sa_running(self, process): """ verify if system agent is running """ - err, pid, _ = self.connection.execute("pgrep -f %s" % process) - return [err == 0, pid] + status, pid, _ = self.connection.execute("pgrep -f %s" % process) + return status == 0, pid def run_collectd_amqp(self): """ run amqp consumer to collect the NFVi data """ |