Merge "'libvirt' guest console in Standalone model"
[yardstick.git] / yardstick / network_services / collector / subscriber.py
index 3bcb208..7e18302 100644 (file)
 # 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):
+    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: ResourceProfile.make_from_node(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 resource.check_if_system_agent_running("collectd")[0] != 0:
+                continue
+
+            try:
+                results[node_name] = {"core": resource.amqp_collect_nfvi_kpi()}
+                LOG.debug("%s collect KPIs %s", node_name, results[node_name]['core'])
+            # NOTE(elfoley): catch a more specific error
+            except Exception as exc:  # pylint: disable=broad-except
+                LOG.exception(exc)
+        return results