1 ##############################################################################
2 # Copyright (c) 2017 Huawei Technologies Co.,Ltd.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
12 from yardstick.common import exceptions
13 from yardstick.common import utils
14 from yardstick.common import kubernetes_utils as k8s_utils
17 class ContainerObject(object):
19 SSH_MOUNT_PATH = '/tmp/.ssh/'
20 IMAGE_DEFAULT = 'openretriever/yardstick'
21 COMMAND_DEFAULT = '/bin/bash'
23 def __init__(self, name, ssh_key, **kwargs):
25 self._ssh_key = ssh_key
26 self._image = kwargs.get('image', self.IMAGE_DEFAULT)
27 self._command = [kwargs.get('command', self.COMMAND_DEFAULT)]
28 self._args = kwargs.get('args', [])
29 self._volume_mounts = kwargs.get('volumeMounts', [])
31 def _create_volume_mounts(self):
32 """Return all "volumeMounts" items per container"""
33 volume_mounts_items = [self._create_volume_mounts_item(vol)
34 for vol in self._volume_mounts]
35 ssh_vol = {'name': self._ssh_key,
36 'mountPath': self.SSH_MOUNT_PATH}
37 volume_mounts_items.append(self._create_volume_mounts_item(ssh_vol))
38 return volume_mounts_items
41 def _create_volume_mounts_item(volume_mount):
42 """Create a "volumeMounts" item"""
43 return {'name': volume_mount['name'],
44 'mountPath': volume_mount['mountPath'],
45 'readOnly': volume_mount.get('readOnly', False)}
47 def get_container_item(self):
48 """Create a "container" item"""
49 container_name = '{}-container'.format(self._name)
50 return {'args': self._args,
51 'command': self._command,
53 'name': container_name,
54 'volumeMounts': self._create_volume_mounts()}
57 class KubernetesObject(object):
59 SSHKEY_DEFAULT = 'yardstick_key'
61 def __init__(self, name, **kwargs):
62 super(KubernetesObject, self).__init__()
63 parameters = copy.deepcopy(kwargs)
65 self.node_selector = parameters.pop('nodeSelector', {})
66 self.ssh_key = parameters.pop('ssh_key', self.SSHKEY_DEFAULT)
67 self._volumes = parameters.pop('volumes', [])
69 containers = parameters.pop('containers', None)
72 ContainerObject(self.name, self.ssh_key, **container)
73 for container in containers]
76 ContainerObject(self.name, self.ssh_key, **parameters)]
80 "kind": "ReplicationController",
101 self._change_value_according_name(name)
102 self._add_containers()
103 self._add_node_selector()
106 def get_template(self):
109 def _change_value_according_name(self, name):
110 utils.set_dict_value(self.template, 'metadata.name', name)
112 utils.set_dict_value(self.template,
113 'spec.template.metadata.labels.app',
116 def _add_containers(self):
117 containers = [container.get_container_item()
118 for container in self._containers]
119 utils.set_dict_value(self.template,
120 'spec.template.spec.containers',
123 def _add_node_selector(self):
124 utils.set_dict_value(self.template,
125 'spec.template.spec.nodeSelector',
128 def _add_volumes(self):
129 """Add "volume" items to container specs, including the SSH one"""
130 volume_items = [self._create_volume_item(vol) for vol in self._volumes]
131 volume_items.append(self._create_ssh_key_volume())
132 utils.set_dict_value(self.template,
133 'spec.template.spec.volumes',
136 def _create_ssh_key_volume(self):
137 """Create a "volume" item of type "configMap" for the SSH key"""
138 return {'name': self.ssh_key,
139 'configMap': {'name': self.ssh_key}}
142 def _create_volume_item(volume):
143 """Create a "volume" item"""
144 volume = copy.deepcopy(volume)
145 name = volume.pop('name')
146 for key in (k for k in volume if k in k8s_utils.get_volume_types()):
148 type_data = volume[key]
151 raise exceptions.KubernetesTemplateInvalidVolumeType(volume=volume)
153 return {'name': name,
154 type_name: type_data}
157 class ServiceObject(object):
159 def __init__(self, name):
160 self.name = '{}-service'.format(name)
163 'name': '{}-service'.format(name)
180 k8s_utils.create_service(self.template)
183 k8s_utils.delete_service(self.name)
186 class KubernetesTemplate(object):
188 def __init__(self, name, context_cfg):
189 """KubernetesTemplate object initialization
191 :param name: (str) name of the Kubernetes context
192 :param context_cfg: (dict) context definition
194 context_cfg = copy.deepcopy(context_cfg)
195 servers_cfg = context_cfg.pop('servers', {})
197 self.ssh_key = '{}-key'.format(name)
199 self.rcs = [self._get_rc_name(rc) for rc in servers_cfg]
200 self.k8s_objs = [KubernetesObject(self._get_rc_name(rc),
201 ssh_key=self.ssh_key,
203 for rc, cfg in servers_cfg.items()]
204 self.service_objs = [ServiceObject(s) for s in self.rcs]
208 def _get_rc_name(self, rc_name):
209 return '{}-{}'.format(rc_name, self.name)
211 def get_rc_pods(self):
212 resp = k8s_utils.get_pod_list()
213 self.pods = [p.metadata.name for p in resp.items for s in self.rcs
214 if p.metadata.name.startswith(s)]