Improve "get_server" function in Kubernetes context
[yardstick.git] / yardstick / benchmark / contexts / kubernetes.py
index a39f631..9feb006 100644 (file)
@@ -15,7 +15,9 @@ import pkg_resources
 import paramiko
 
 from yardstick.benchmark.contexts.base import Context
-from yardstick.orchestrator.kubernetes import KubernetesTemplate
+from yardstick.orchestrator import kubernetes
+from yardstick.common import constants
+from yardstick.common import exceptions
 from yardstick.common import kubernetes_utils as k8s_utils
 from yardstick.common import utils
 
@@ -29,22 +31,17 @@ class KubernetesContext(Context):
     __context_type__ = "Kubernetes"
 
     def __init__(self):
-        self.name = ''
         self.ssh_key = ''
         self.key_path = ''
         self.public_key_path = ''
         self.template = None
-
-        super(KubernetesContext, self).__init__()
+        super(KubernetesContext, self).__init__(host_name_separator='-')
 
     def init(self, attrs):
-        self.name = attrs.get('name', '')
-
-        template_cfg = attrs.get('servers', {})
-        self.template = KubernetesTemplate(self.name, template_cfg)
+        super(KubernetesContext, self).init(attrs)
 
+        self.template = kubernetes.KubernetesTemplate(self.name, attrs)
         self.ssh_key = '{}-key'.format(self.name)
-
         self.key_path = self._get_key_path()
         self.public_key_path = '{}.pub'.format(self.key_path)
 
@@ -52,8 +49,11 @@ class KubernetesContext(Context):
         LOG.info('Creating ssh key')
         self._set_ssh_key()
 
+        self._create_crd()
+        self._create_networks()
         LOG.info('Launch containers')
         self._create_rcs()
+        self._create_services()
         time.sleep(1)
         self.template.get_rc_pods()
 
@@ -63,6 +63,9 @@ class KubernetesContext(Context):
         self._delete_ssh_key()
         self._delete_rcs()
         self._delete_pods()
+        self._delete_services()
+        self._delete_networks()
+        self._delete_crd()
 
         super(KubernetesContext, self).undeploy()
 
@@ -80,6 +83,14 @@ class KubernetesContext(Context):
             return False
         return True
 
+    def _create_services(self):
+        for obj in self.template.service_objs:
+            obj.create()
+
+    def _delete_services(self):
+        for obj in self.template.service_objs:
+            obj.delete()
+
     def _create_rcs(self):
         for obj in self.template.k8s_objs:
             self._create_rc(obj.get_template())
@@ -101,6 +112,26 @@ class KubernetesContext(Context):
     def _delete_pod(self, pod):
         k8s_utils.delete_pod(pod)
 
+    def _create_crd(self):
+        LOG.info('Create Custom Resource Definition elements')
+        for crd in self.template.crd:
+            crd.create()
+
+    def _delete_crd(self):
+        LOG.info('Delete Custom Resource Definition elements')
+        for crd in self.template.crd:
+            crd.delete()
+
+    def _create_networks(self):  # pragma: no cover
+        LOG.info('Create Network elements')
+        for net in self.template.network_objs:
+            net.create()
+
+    def _delete_networks(self):  # pragma: no cover
+        LOG.info('Create Network elements')
+        for net in self.template.network_objs:
+            net.delete()
+
     def _get_key_path(self):
         task_id = self.name.split('-')[-1]
         k = 'files/yardstick_key-{}'.format(task_id)
@@ -126,15 +157,35 @@ class KubernetesContext(Context):
         utils.remove_file(self.public_key_path)
 
     def _get_server(self, name):
-        resp = k8s_utils.get_pod_list()
-        hosts = ({'name': n.metadata.name,
-                  'ip': n.status.pod_ip,
-                  'user': 'root',
-                  'key_filename': self.key_path,
-                  'private_ip': n.status.pod_ip}
-                 for n in resp.items if n.metadata.name.startswith(name))
-
-        return next(hosts, None)
+        service_name = '{}-service'.format(name)
+        service = k8s_utils.get_service_by_name(service_name)
+        if not service:
+            raise exceptions.KubernetesServiceObjectNotDefined()
+
+        for sn_port in (sn_port for sn_port in service.ports
+                        if sn_port.port == constants.SSH_PORT):
+            node_port = sn_port.node_port
+            break
+        else:
+            raise exceptions.KubernetesSSHPortNotDefined()
+
+        return {
+            'name': name,
+            'ip': self._get_node_ip(),
+            'private_ip': k8s_utils.get_pod_by_name(name).status.pod_ip,
+            'ssh_port': node_port,
+            'user': 'root',
+            'key_filename': self.key_path
+        }
+
+    def _get_node_ip(self):
+        return k8s_utils.get_node_list().items[0].status.addresses[0].address
 
     def _get_network(self, attr_name):
         return None
+
+    def _get_physical_nodes(self):
+        return None
+
+    def _get_physical_node_for_server(self, server_name):
+        return None