Merge "[dovetail] split the sla check results into process recovery and service recov...
[yardstick.git] / yardstick / benchmark / contexts / heat.py
index cc87176..f4c48f4 100644 (file)
@@ -16,6 +16,7 @@ from collections import OrderedDict
 import ipaddress
 import pkg_resources
 
+from yardstick.benchmark import contexts
 from yardstick.benchmark.contexts.base import Context
 from yardstick.benchmark.contexts.model import Network
 from yardstick.benchmark.contexts.model import PlacementGroup, ServerGroup
@@ -29,6 +30,7 @@ from yardstick.common import constants as consts
 from yardstick.common import utils
 from yardstick.common.utils import source_env
 from yardstick.ssh import SSH
+from yardstick.common import openstack_utils
 
 LOG = logging.getLogger(__name__)
 
@@ -46,7 +48,7 @@ def h_join(*args):
 class HeatContext(Context):
     """Class that represents a context in the logical model"""
 
-    __context_type__ = "Heat"
+    __context_type__ = contexts.CONTEXT_HEAT
 
     def __init__(self):
         self.stack = None
@@ -57,6 +59,7 @@ class HeatContext(Context):
         self.server_groups = []
         self.keypair_name = None
         self.secgroup_name = None
+        self.security_group = None
         self._server_map = {}
         self.attrs = {}
         self._image = None
@@ -68,6 +71,12 @@ class HeatContext(Context):
         self.shade_client = None
         self.heat_timeout = None
         self.key_filename = None
+        self.shade_client = None
+        self.operator_client = None
+        self.nodes = []
+        self.controllers = []
+        self.computes = []
+        self.baremetals = []
         super(HeatContext, self).__init__()
 
     @staticmethod
@@ -96,14 +105,25 @@ class HeatContext(Context):
 
         self.template_file = attrs.get("heat_template")
 
+        self.shade_client = openstack_utils.get_shade_client()
+        self.operator_client = openstack_utils.get_shade_operator_client()
+
+        try:
+            self.read_pod_file(attrs)
+        except IOError:
+            LOG.warning("No pod file specified. NVFi metrics will be disabled")
+
         self.heat_timeout = attrs.get("timeout", DEFAULT_HEAT_TIMEOUT)
         if self.template_file:
             self.heat_parameters = attrs.get("heat_parameters")
             return
 
         self.keypair_name = h_join(self.name, "key")
+
         self.secgroup_name = h_join(self.name, "secgroup")
 
+        self.security_group = attrs.get("security_group")
+
         self._image = attrs.get("image")
 
         self._flavor = attrs.get("flavor")
@@ -169,7 +189,7 @@ class HeatContext(Context):
                 self.flavors.add(flavor)
 
         template.add_keypair(self.keypair_name, self.name)
-        template.add_security_group(self.secgroup_name)
+        template.add_security_group(self.secgroup_name, self.security_group)
 
         for network in self.networks.values():
             # Using existing network
@@ -488,10 +508,12 @@ class HeatContext(Context):
         pkey = pkg_resources.resource_string(
             'yardstick.resources',
             h_join('files/yardstick_key', self.name)).decode('utf-8')
-
+        key_filename = pkg_resources.resource_filename('yardstick.resources',
+            h_join('files/yardstick_key', self.name))
         result = {
             "user": server.context.user,
             "pkey": pkey,
+            "key_filename": key_filename,
             "private_ip": server.private_ip,
             "interfaces": server.interfaces,
             "routing_table": self.generate_routing_table(server),
@@ -528,3 +550,30 @@ class HeatContext(Context):
             "physical_network": network.physical_network,
         }
         return result
+
+    def _get_physical_nodes(self):
+        return self.nodes
+
+    def _get_physical_node_for_server(self, server_name):
+        node_name, ctx_name = self.split_host_name(server_name)
+        if ctx_name is None or self.name != ctx_name:
+            return None
+
+        matching_nodes = [s for s in self.servers if s.name == node_name]
+        if len(matching_nodes) == 0:
+            return None
+
+        server = openstack_utils.get_server(self.shade_client,
+                                            name_or_id=server_name)
+
+        if server:
+            server = server.toDict()
+            list_hypervisors = self.operator_client.list_hypervisors()
+
+            for hypervisor in list_hypervisors:
+                if hypervisor.hypervisor_hostname == server['OS-EXT-SRV-ATTR:hypervisor_hostname']:
+                    for node in self.nodes:
+                        if node['ip'] == hypervisor.host_ip:
+                            return "{}.{}".format(node['name'], self._name)
+
+        return None