Merge "Install dependencies: bare-metal, standalone"
[yardstick.git] / yardstick / tests / unit / benchmark / contexts / test_kubernetes.py
1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
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 import mock
11 import unittest
12
13 from yardstick.benchmark.contexts import base
14 from yardstick.benchmark.contexts import kubernetes
15
16
17 context_cfg = {
18     'type': 'Kubernetes',
19     'name': 'k8s',
20     'task_id': '1234567890',
21     'servers': {
22         'host': {
23             'image': 'openretriever/yardstick',
24             'command': '/bin/bash',
25             'args': ['-c', 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; \
26 service ssh restart;while true ; do sleep 10000; done']
27         },
28         'target': {
29             'image': 'openretriever/yardstick',
30             'command': '/bin/bash',
31             'args': ['-c', 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; \
32 service ssh restart;while true ; do sleep 10000; done']
33         }
34     }
35 }
36
37 prefix = 'yardstick.benchmark.contexts.kubernetes'
38
39
40 class KubernetesTestCase(unittest.TestCase):
41
42     def setUp(self):
43         self.k8s_context = kubernetes.KubernetesContext()
44         self.addCleanup(self._remove_contexts)
45         self.k8s_context.init(context_cfg)
46
47     @staticmethod
48     def _remove_contexts():
49         for context in base.Context.list:
50             context._delete_context()
51         base.Context.list = []
52
53     @mock.patch.object(kubernetes.KubernetesContext, '_delete_services')
54     @mock.patch.object(kubernetes.KubernetesContext, '_delete_ssh_key')
55     @mock.patch.object(kubernetes.KubernetesContext, '_delete_rcs')
56     @mock.patch.object(kubernetes.KubernetesContext, '_delete_pods')
57     def test_undeploy(self,
58                       mock_delete_pods,
59                       mock_delete_rcs,
60                       mock_delete_ssh,
61                       mock_delete_services):
62
63         self.k8s_context.undeploy()
64         mock_delete_ssh.assert_called_once()
65         mock_delete_rcs.assert_called_once()
66         mock_delete_pods.assert_called_once()
67         mock_delete_services.assert_called_once()
68
69     @mock.patch.object(kubernetes.KubernetesContext, '_create_services')
70     @mock.patch.object(kubernetes.KubernetesContext, '_wait_until_running')
71     @mock.patch.object(kubernetes.KubernetesTemplate, 'get_rc_pods')
72     @mock.patch.object(kubernetes.KubernetesContext, '_create_rcs')
73     @mock.patch.object(kubernetes.KubernetesContext, '_set_ssh_key')
74     def test_deploy(self,
75                     mock_set_ssh_key,
76                     mock_create_rcs,
77                     mock_get_rc_pods,
78                     mock_wait_until_running,
79                     mock_create_services):
80
81         with mock.patch("yardstick.benchmark.contexts.kubernetes.time"):
82             self.k8s_context.deploy()
83         mock_set_ssh_key.assert_called_once()
84         mock_create_rcs.assert_called_once()
85         mock_create_services.assert_called_once()
86         mock_get_rc_pods.assert_called_once()
87         mock_wait_until_running.assert_called_once()
88
89     @mock.patch.object(kubernetes, 'paramiko', **{"resource_filename.return_value": ""})
90     @mock.patch.object(kubernetes, 'pkg_resources', **{"resource_filename.return_value": ""})
91     @mock.patch.object(kubernetes, 'utils')
92     @mock.patch.object(kubernetes, 'open', create=True)
93     @mock.patch.object(kubernetes.k8s_utils, 'delete_config_map')
94     @mock.patch.object(kubernetes.k8s_utils, 'create_config_map')
95     def test_ssh_key(self, mock_create, mock_delete, *args):
96         self.k8s_context._set_ssh_key()
97         self.k8s_context._delete_ssh_key()
98
99         mock_create.assert_called_once()
100         mock_delete.assert_called_once()
101
102     @mock.patch.object(kubernetes.k8s_utils, 'read_pod_status')
103     def test_wait_until_running(self, mock_read_pod_status):
104
105         self.k8s_context.template.pods = ['server']
106         mock_read_pod_status.return_value = 'Running'
107         self.k8s_context._wait_until_running()
108
109     @mock.patch.object(kubernetes.k8s_utils, 'get_pod_by_name')
110     @mock.patch.object(kubernetes.KubernetesContext, '_get_node_ip')
111     @mock.patch.object(kubernetes.k8s_utils, 'get_service_by_name')
112     def test_get_server(self,
113                         mock_get_service_by_name,
114                         mock_get_node_ip,
115                         mock_get_pod_by_name):
116         class Service(object):
117             def __init__(self):
118                 self.name = 'yardstick'
119                 self.node_port = 30000
120
121         class Services(object):
122             def __init__(self):
123                 self.ports = [Service()]
124
125         class Status(object):
126             def __init__(self):
127                 self.pod_ip = '172.16.10.131'
128
129         class Pod(object):
130             def __init__(self):
131                 self.status = Status()
132
133         mock_get_service_by_name.return_value = Services()
134         mock_get_pod_by_name.return_value = Pod()
135         mock_get_node_ip.return_value = '172.16.10.131'
136
137         self.assertIsNotNone(self.k8s_context._get_server('server'))
138
139     @mock.patch.object(kubernetes.KubernetesContext, '_create_rc')
140     def test_create_rcs(self, mock_create_rc):
141         self.k8s_context._create_rcs()
142         mock_create_rc.assert_called()
143
144     @mock.patch.object(kubernetes.k8s_utils, 'create_replication_controller')
145     def test_create_rc(self, mock_create_replication_controller):
146         self.k8s_context._create_rc({})
147         mock_create_replication_controller.assert_called_once()
148
149     @mock.patch.object(kubernetes.KubernetesContext, '_delete_rc')
150     def test_delete_rcs(self, mock_delete_rc):
151         self.k8s_context._delete_rcs()
152         mock_delete_rc.assert_called()
153
154     @mock.patch.object(kubernetes.k8s_utils, 'delete_replication_controller')
155     def test_delete_rc(self, mock_delete_replication_controller):
156         self.k8s_context._delete_rc({})
157         mock_delete_replication_controller.assert_called_once()
158
159     @mock.patch.object(kubernetes.k8s_utils, 'get_node_list')
160     def test_get_node_ip(self, mock_get_node_list):
161         self.k8s_context._get_node_ip()
162         mock_get_node_list.assert_called_once()
163
164     @mock.patch('yardstick.orchestrator.kubernetes.ServiceObject.create')
165     def test_create_services(self, mock_create):
166         self.k8s_context._create_services()
167         mock_create.assert_called()
168
169     @mock.patch('yardstick.orchestrator.kubernetes.ServiceObject.delete')
170     def test_delete_services(self, mock_delete):
171         self.k8s_context._delete_services()
172         mock_delete.assert_called()