Merge "Open storperf testcase to huawei-pod2"
[yardstick.git] / yardstick / orchestrator / kubernetes.py
1 ##############################################################################
2 # Copyright (c) 2017 Huawei Technologies Co.,Ltd.
3 #
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 ##############################################################################
9
10 from __future__ import absolute_import
11 from __future__ import print_function
12
13 from yardstick.common import utils
14 from yardstick.common import kubernetes_utils as k8s_utils
15
16
17 class KubernetesObject(object):
18
19     def __init__(self, name, **kwargs):
20         super(KubernetesObject, self).__init__()
21         self.name = name
22         self.image = kwargs.get('image', 'openretriever/yardstick')
23         self.command = [kwargs.get('command', '/bin/bash')]
24         self.args = kwargs.get('args', [])
25         self.ssh_key = kwargs.get('ssh_key', 'yardstick_key')
26
27         self.volumes = []
28
29         self.template = {
30             "apiVersion": "v1",
31             "kind": "ReplicationController",
32             "metadata": {
33                 "name": ""
34             },
35             "spec": {
36                 "replicas": 1,
37                 "template": {
38                     "metadata": {
39                         "labels": {
40                             "app": ""
41                         }
42                     },
43                     "spec": {
44                         "containers": [],
45                         "volumes": []
46                     }
47                 }
48             }
49         }
50
51         self._change_value_according_name(name)
52         self._add_containers()
53         self._add_ssh_key_volume()
54         self._add_volumes()
55
56     def get_template(self):
57         return self.template
58
59     def _change_value_according_name(self, name):
60         utils.set_dict_value(self.template, 'metadata.name', name)
61
62         utils.set_dict_value(self.template,
63                              'spec.template.metadata.labels.app',
64                              name)
65
66     def _add_containers(self):
67         containers = [self._add_container()]
68         utils.set_dict_value(self.template,
69                              'spec.template.spec.containers',
70                              containers)
71
72     def _add_container(self):
73         container_name = '{}-container'.format(self.name)
74         ssh_key_mount_path = "/root/.ssh/"
75
76         container = {
77             "args": self.args,
78             "command": self.command,
79             "image": self.image,
80             "name": container_name,
81             "volumeMounts": [
82                 {
83                     "mountPath": ssh_key_mount_path,
84                     "name": self.ssh_key
85                 }
86             ]
87         }
88
89         return container
90
91     def _add_volumes(self):
92         utils.set_dict_value(self.template,
93                              'spec.template.spec.volumes',
94                              self.volumes)
95
96     def _add_volume(self, volume):
97         self.volumes.append(volume)
98
99     def _add_ssh_key_volume(self):
100         key_volume = {
101             "configMap": {
102                 "name": self.ssh_key
103             },
104             "name": self.ssh_key
105         }
106         self._add_volume(key_volume)
107
108
109 class KubernetesTemplate(object):
110
111     def __init__(self, name, template_cfg):
112         self.name = name
113         self.ssh_key = '{}-key'.format(name)
114
115         self.rcs = [self._get_rc_name(rc) for rc in template_cfg]
116         self.k8s_objs = [KubernetesObject(self._get_rc_name(rc),
117                                           ssh_key=self.ssh_key,
118                                           **cfg)
119                          for rc, cfg in template_cfg.items()]
120         self.pods = []
121
122     def _get_rc_name(self, rc_name):
123         return '{}-{}'.format(rc_name, self.name)
124
125     def get_rc_pods(self):
126         resp = k8s_utils.get_pod_list()
127         self.pods = [p.metadata.name for p in resp.items for s in self.rcs
128                      if p.metadata.name.startswith(s)]
129
130         return self.pods