Merge "Switch to blocking: false for ODL in functest-smoke"
[functest.git] / functest / tests / unit / openstack / tempest / test_conf_utils.py
1 #!/usr/bin/env python
2
3 # All rights reserved. This program and the accompanying materials
4 # are made available under the terms of the Apache License, Version 2.0
5 # which accompanies this distribution, and is available at
6 # http://www.apache.org/licenses/LICENSE-2.0
7
8 import logging
9 import unittest
10
11 import mock
12
13 from functest.opnfv_tests.openstack.tempest import conf_utils
14 from functest.utils.constants import CONST
15
16
17 class OSTempestConfUtilsTesting(unittest.TestCase):
18
19     def test_create_tempest_resources_missing_network_dic(self):
20         with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
21                         'os_utils.get_keystone_client',
22                         return_value=mock.Mock()), \
23             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
24                        'os_utils.create_tenant',
25                        return_value='test_tenant_id'), \
26             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
27                        'os_utils.create_user',
28                        return_value='test_user_id'), \
29             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
30                        'os_utils.create_shared_network_full',
31                        return_value=None), \
32                 self.assertRaises(Exception) as context:
33             conf_utils.create_tempest_resources()
34             msg = 'Failed to create private network'
35             self.assertTrue(msg in context)
36
37     def test_create_tempest_resources_missing_image(self):
38         with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
39                         'os_utils.get_keystone_client',
40                         return_value=mock.Mock()), \
41             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
42                        'os_utils.create_tenant',
43                        return_value='test_tenant_id'), \
44             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
45                        'os_utils.create_user',
46                        return_value='test_user_id'), \
47             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
48                        'os_utils.create_shared_network_full',
49                        return_value=mock.Mock()), \
50             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
51                        'os_utils.get_or_create_image',
52                        return_value=(mock.Mock(), None)), \
53                 self.assertRaises(Exception) as context:
54
55             CONST.__setattr__('tempest_use_custom_images', True)
56             conf_utils.create_tempest_resources()
57             msg = 'Failed to create image'
58             self.assertTrue(msg in context)
59
60             CONST.__setattr__('tempest_use_custom_images', False)
61             conf_utils.create_tempest_resources(use_custom_images=True)
62             msg = 'Failed to create image'
63             self.assertTrue(msg in context)
64
65     def test_create_tempest_resources_missing_flavor(self):
66         with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
67                         'os_utils.get_keystone_client',
68                         return_value=mock.Mock()), \
69             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
70                        'os_utils.create_tenant',
71                        return_value='test_tenant_id'), \
72             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
73                        'os_utils.create_user',
74                        return_value='test_user_id'), \
75             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
76                        'os_utils.create_shared_network_full',
77                        return_value=mock.Mock()), \
78             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
79                        'os_utils.get_or_create_image',
80                        return_value=(mock.Mock(), 'image_id')), \
81             mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
82                        'os_utils.get_or_create_flavor',
83                        return_value=(mock.Mock(), None)), \
84                 self.assertRaises(Exception) as context:
85             CONST.__setattr__('tempest_use_custom_images', True)
86             CONST.__setattr__('tempest_use_custom_flavors', True)
87             conf_utils.create_tempest_resources()
88             msg = 'Failed to create flavor'
89             self.assertTrue(msg in context)
90
91             CONST.__setattr__('tempest_use_custom_images', True)
92             CONST.__setattr__('tempest_use_custom_flavors', False)
93             conf_utils.create_tempest_resources(use_custom_flavors=False)
94             msg = 'Failed to create flavor'
95             self.assertTrue(msg in context)
96
97     def test_get_verifier_id_missing_verifier(self):
98         CONST.__setattr__('tempest_deployment_name', 'test_deploy_name')
99         with mock.patch('functest.opnfv_tests.openstack.tempest.'
100                         'conf_utils.subprocess.Popen') as mock_popen, \
101                 self.assertRaises(Exception):
102             mock_stdout = mock.Mock()
103             attrs = {'stdout.readline.return_value': ''}
104             mock_stdout.configure_mock(**attrs)
105             mock_popen.return_value = mock_stdout
106             conf_utils.get_verifier_id(),
107
108     def test_get_verifier_id_default(self):
109         CONST.__setattr__('tempest_deployment_name', 'test_deploy_name')
110         with mock.patch('functest.opnfv_tests.openstack.tempest.'
111                         'conf_utils.subprocess.Popen') as mock_popen:
112             mock_stdout = mock.Mock()
113             attrs = {'stdout.readline.return_value': 'test_deploy_id'}
114             mock_stdout.configure_mock(**attrs)
115             mock_popen.return_value = mock_stdout
116
117             self.assertEqual(conf_utils.get_verifier_id(),
118                              'test_deploy_id')
119
120     def test_get_verifier_deployment_id_missing_rally(self):
121         CONST.__setattr__('tempest_deployment_name', 'test_deploy_name')
122         with mock.patch('functest.opnfv_tests.openstack.tempest.'
123                         'conf_utils.subprocess.Popen') as mock_popen, \
124                 self.assertRaises(Exception):
125             mock_stdout = mock.Mock()
126             attrs = {'stdout.readline.return_value': ''}
127             mock_stdout.configure_mock(**attrs)
128             mock_popen.return_value = mock_stdout
129             conf_utils.get_verifier_deployment_id(),
130
131     def test_get_verifier_deployment_id_default(self):
132         CONST.__setattr__('tempest_deployment_name', 'test_deploy_name')
133         with mock.patch('functest.opnfv_tests.openstack.tempest.'
134                         'conf_utils.subprocess.Popen') as mock_popen:
135             mock_stdout = mock.Mock()
136             attrs = {'stdout.readline.return_value': 'test_deploy_id'}
137             mock_stdout.configure_mock(**attrs)
138             mock_popen.return_value = mock_stdout
139
140             self.assertEqual(conf_utils.get_verifier_deployment_id(),
141                              'test_deploy_id')
142
143     def test_get_verifier_repo_dir_default(self):
144         with mock.patch('functest.opnfv_tests.openstack.tempest.'
145                         'conf_utils.os.path.join',
146                         return_value='test_verifier_repo_dir'), \
147             mock.patch('functest.opnfv_tests.openstack.tempest.'
148                        'conf_utils.get_verifier_id') as m:
149             self.assertEqual(conf_utils.get_verifier_repo_dir(''),
150                              'test_verifier_repo_dir')
151             self.assertTrue(m.called)
152
153     def test_get_verifier_deployment_dir_default(self):
154         with mock.patch('functest.opnfv_tests.openstack.tempest.'
155                         'conf_utils.os.path.join',
156                         return_value='test_verifier_repo_dir'), \
157             mock.patch('functest.opnfv_tests.openstack.tempest.'
158                        'conf_utils.get_verifier_id') as m1, \
159             mock.patch('functest.opnfv_tests.openstack.tempest.'
160                        'conf_utils.get_verifier_deployment_id') as m2:
161             self.assertEqual(conf_utils.get_verifier_deployment_dir('', ''),
162                              'test_verifier_repo_dir')
163             self.assertTrue(m1.called)
164             self.assertTrue(m2.called)
165
166     def test_get_repo_tag_default(self):
167         mock_popen = mock.Mock()
168         attrs = {'stdout.readline.return_value': 'test_tag'}
169         mock_popen.configure_mock(**attrs)
170
171         with mock.patch('functest.opnfv_tests.openstack.tempest.'
172                         'conf_utils.subprocess.Popen',
173                         return_value=mock_popen):
174             self.assertEqual(conf_utils.get_repo_tag('test_repo'),
175                              'test_tag')
176
177     def test_backup_tempest_config_default(self):
178         with mock.patch('functest.opnfv_tests.openstack.tempest.'
179                         'conf_utils.os.path.exists',
180                         return_value=False), \
181             mock.patch('functest.opnfv_tests.openstack.tempest.'
182                        'conf_utils.os.makedirs') as m1, \
183             mock.patch('functest.opnfv_tests.openstack.tempest.'
184                        'conf_utils.shutil.copyfile') as m2:
185             conf_utils.backup_tempest_config('test_conf_file')
186             self.assertTrue(m1.called)
187             self.assertTrue(m2.called)
188
189         with mock.patch('functest.opnfv_tests.openstack.tempest.'
190                         'conf_utils.os.path.exists',
191                         return_value=True), \
192             mock.patch('functest.opnfv_tests.openstack.tempest.'
193                        'conf_utils.shutil.copyfile') as m2:
194             conf_utils.backup_tempest_config('test_conf_file')
195             self.assertTrue(m2.called)
196
197     def test_configure_tempest_default(self):
198         with mock.patch('functest.opnfv_tests.openstack.tempest.'
199                         'conf_utils.configure_verifier',
200                         return_value='test_conf_file'), \
201             mock.patch('functest.opnfv_tests.openstack.tempest.'
202                        'conf_utils.configure_tempest_update_params') as m1:
203             conf_utils.configure_tempest('test_dep_dir')
204             self.assertTrue(m1.called)
205
206     def test_configure_tempest_defcore_default(self):
207         img_flavor_dict = {'image_id': 'test_image_id',
208                            'flavor_id': 'test_flavor_id',
209                            'image_id_alt': 'test_image_alt_id',
210                            'flavor_id_alt': 'test_flavor_alt_id'}
211         with mock.patch('functest.opnfv_tests.openstack.tempest.'
212                         'conf_utils.configure_verifier',
213                         return_value='test_conf_file'), \
214             mock.patch('functest.opnfv_tests.openstack.tempest.'
215                        'conf_utils.configure_tempest_update_params'), \
216             mock.patch('functest.opnfv_tests.openstack.tempest.'
217                        'conf_utils.ConfigParser.RawConfigParser.'
218                        'set') as mset, \
219             mock.patch('functest.opnfv_tests.openstack.tempest.'
220                        'conf_utils.ConfigParser.RawConfigParser.'
221                        'read') as mread, \
222             mock.patch('functest.opnfv_tests.openstack.tempest.'
223                        'conf_utils.ConfigParser.RawConfigParser.'
224                        'write') as mwrite, \
225             mock.patch('__builtin__.open', mock.mock_open()), \
226             mock.patch('functest.opnfv_tests.openstack.tempest.'
227                        'conf_utils.shutil.copyfile'):
228             conf_utils.configure_tempest_defcore('test_dep_dir',
229                                                  img_flavor_dict)
230             mset.assert_any_call('compute', 'image_ref', 'test_image_id')
231             mset.assert_any_call('compute', 'image_ref_alt',
232                                  'test_image_alt_id')
233             mset.assert_any_call('compute', 'flavor_ref', 'test_flavor_id')
234             mset.assert_any_call('compute', 'flavor_ref_alt',
235                                  'test_flavor_alt_id')
236             self.assertTrue(mread.called)
237             self.assertTrue(mwrite.called)
238
239     def _test_missing_param(self, params, image_id, flavor_id):
240         with mock.patch('functest.opnfv_tests.openstack.tempest.'
241                         'conf_utils.ConfigParser.RawConfigParser.'
242                         'set') as mset, \
243             mock.patch('functest.opnfv_tests.openstack.tempest.'
244                        'conf_utils.ConfigParser.RawConfigParser.'
245                        'read') as mread, \
246             mock.patch('functest.opnfv_tests.openstack.tempest.'
247                        'conf_utils.ConfigParser.RawConfigParser.'
248                        'write') as mwrite, \
249             mock.patch('__builtin__.open', mock.mock_open()), \
250             mock.patch('functest.opnfv_tests.openstack.tempest.'
251                        'conf_utils.backup_tempest_config'), \
252             mock.patch('functest.utils.functest_utils.yaml.safe_load',
253                        return_value={'validation': {'ssh_timeout': 300}}):
254             CONST.__setattr__('OS_ENDPOINT_TYPE', None)
255             conf_utils.\
256                 configure_tempest_update_params('test_conf_file',
257                                                 IMAGE_ID=image_id,
258                                                 FLAVOR_ID=flavor_id)
259             mset.assert_any_call(params[0], params[1], params[2])
260             self.assertTrue(mread.called)
261             self.assertTrue(mwrite.called)
262
263     def test_configure_tempest_update_params_missing_image_id(self):
264             CONST.__setattr__('tempest_use_custom_images', True)
265             self._test_missing_param(('compute', 'image_ref',
266                                       'test_image_id'), 'test_image_id',
267                                      None)
268
269     def test_configure_tempest_update_params_missing_image_id_alt(self):
270             CONST.__setattr__('tempest_use_custom_images', True)
271             conf_utils.IMAGE_ID_ALT = 'test_image_id_alt'
272             self._test_missing_param(('compute', 'image_ref_alt',
273                                       'test_image_id_alt'), None, None)
274
275     def test_configure_tempest_update_params_missing_flavor_id(self):
276             CONST.__setattr__('tempest_use_custom_flavors', True)
277             self._test_missing_param(('compute', 'flavor_ref',
278                                       'test_flavor_id'), None,
279                                      'test_flavor_id')
280
281     def test_configure_tempest_update_params_missing_flavor_id_alt(self):
282             CONST.__setattr__('tempest_use_custom_flavors', True)
283             conf_utils.FLAVOR_ID_ALT = 'test_flavor_id_alt'
284             self._test_missing_param(('compute', 'flavor_ref_alt',
285                                       'test_flavor_id_alt'), None,
286                                      None)
287
288     def test_configure_verifier_missing_temp_conf_file(self):
289         with mock.patch('functest.opnfv_tests.openstack.tempest.'
290                         'conf_utils.os.path.isfile',
291                         return_value=False), \
292             mock.patch('functest.opnfv_tests.openstack.tempest.'
293                        'conf_utils.ft_utils.execute_command') as mexe, \
294                 self.assertRaises(Exception) as context:
295             conf_utils.configure_verifier('test_dep_dir')
296             mexe.assert_any_call("rally verify configure-verifier")
297             msg = ("Tempest configuration file 'test_dep_dir/tempest.conf'"
298                    " NOT found.")
299             self.assertTrue(msg in context)
300
301     def test_configure_verifier_default(self):
302         with mock.patch('functest.opnfv_tests.openstack.tempest.'
303                         'conf_utils.os.path.isfile',
304                         return_value=True), \
305             mock.patch('functest.opnfv_tests.openstack.tempest.'
306                        'conf_utils.ft_utils.execute_command') as mexe:
307             self.assertEqual(conf_utils.configure_verifier('test_dep_dir'),
308                              'test_dep_dir/tempest.conf')
309             mexe.assert_any_call("rally verify configure-verifier "
310                                  "--reconfigure")
311
312
313 if __name__ == "__main__":
314     logging.disable(logging.CRITICAL)
315     unittest.main(verbosity=2)