Merge changes from topic 'docs/fix-warnings'
[yardstick.git] / yardstick / benchmark / contexts / node.py
index 35c6433..d233e02 100644 (file)
@@ -7,8 +7,6 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-from __future__ import absolute_import
-import errno
 import subprocess
 import os
 import collections
@@ -17,12 +15,13 @@ import tempfile
 
 import six
 import pkg_resources
-import yaml
 
 from yardstick import ssh
+from yardstick.benchmark import contexts
 from yardstick.benchmark.contexts.base import Context
 from yardstick.common.constants import ANSIBLE_DIR, YARDSTICK_ROOT_PATH
 from yardstick.common.ansible_common import AnsibleCommon
+from yardstick.common.exceptions import ContextUpdateCollectdForNodeError
 
 LOG = logging.getLogger(__name__)
 
@@ -32,10 +31,9 @@ DEFAULT_DISPATCH = 'script'
 class NodeContext(Context):
     """Class that handle nodes info"""
 
-    __context_type__ = "Node"
+    __context_type__ = contexts.CONTEXT_NODE
 
     def __init__(self):
-        self.name = None
         self.file_path = None
         self.nodes = []
         self.networks = {}
@@ -50,39 +48,11 @@ class NodeContext(Context):
         }
         super(NodeContext, self).__init__()
 
-    def read_config_file(self):
-        """Read from config file"""
-
-        with open(self.file_path) as stream:
-            LOG.info("Parsing pod file: %s", self.file_path)
-            cfg = yaml.safe_load(stream)
-        return cfg
-
     def init(self, attrs):
         """initializes itself from the supplied arguments"""
-        self.name = attrs["name"]
-        self.file_path = file_path = attrs.get("file", "pod.yaml")
+        super(NodeContext, self).init(attrs)
 
-        try:
-            cfg = self.read_config_file()
-        except IOError as io_error:
-            if io_error.errno != errno.ENOENT:
-                raise
-
-            self.file_path = os.path.join(YARDSTICK_ROOT_PATH, file_path)
-            cfg = self.read_config_file()
-
-        self.nodes.extend(cfg["nodes"])
-        self.controllers.extend([node for node in cfg["nodes"]
-                                 if node["role"] == "Controller"])
-        self.computes.extend([node for node in cfg["nodes"]
-                              if node["role"] == "Compute"])
-        self.baremetals.extend([node for node in cfg["nodes"]
-                                if node["role"] == "Baremetal"])
-        LOG.debug("Nodes: %r", self.nodes)
-        LOG.debug("Controllers: %r", self.controllers)
-        LOG.debug("Computes: %r", self.computes)
-        LOG.debug("BareMetals: %r", self.baremetals)
+        cfg = self.read_pod_file(attrs)
 
         self.env = attrs.get('env', {})
         self.attrs = attrs
@@ -135,11 +105,37 @@ class NodeContext(Context):
             playbook = os.path.join(ANSIBLE_DIR, playbook)
         return playbook
 
+    def _get_physical_nodes(self):
+        return self.nodes
+
+    def _get_physical_node_for_server(self, server_name):
+
+        node_name, context_name = self.split_host_name(server_name)
+
+        if context_name is None or self.name != context_name:
+            return None
+
+        for n in (n for n in self.nodes if n["name"] == node_name):
+            return "{}.{}".format(n["name"], self._name)
+
+        return None
+
+    def update_collectd_options_for_node(self, options, attr_name):
+        node_name, _ = self.split_host_name(attr_name)
+
+        matching_nodes = (n for n in self.nodes if n["name"] == node_name)
+        try:
+            node = next(matching_nodes)
+        except StopIteration:
+            raise ContextUpdateCollectdForNodeError(attr_name=attr_name)
+
+        node["collectd"] = options
+
     def _get_server(self, attr_name):
         """lookup server info by name from context
         attr_name: a name for a server listed in nodes config file
         """
-        node_name, name = self.split_name(attr_name)
+        node_name, name = self.split_host_name(attr_name)
         if name is None or self.name != name:
             return None
 
@@ -157,7 +153,7 @@ class NodeContext(Context):
         except StopIteration:
             pass
         else:
-            raise ValueError("Duplicate nodes!!! Nodes: %s %s",
+            raise ValueError("Duplicate nodes!!! Nodes: %s %s" %
                              (node, duplicate))
 
         node["name"] = attr_name
@@ -204,7 +200,7 @@ class NodeContext(Context):
         self.client._put_file_shell(script_file, '~/{}'.format(script))
 
         cmd = 'sudo bash {} {}'.format(script, options)
-        status, stdout, stderr = self.client.execute(cmd)
+        status, _, stderr = self.client.execute(cmd)
         if status:
             raise RuntimeError(stderr)