blob: 94fb74b953c084b38e8febb3f87f9c50154f0bb4 [file] [log] [blame]
Matthew Treinish9b896242014-04-23 21:25:27 +00001# Copyright 2014 IBM Corp.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
Manik Bindlishebc7f5e2018-08-29 06:12:07 +000015import os
16
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +070017import fixtures
Matthew Treinishd14c9df2014-04-27 00:54:25 -040018import mock
Matthew Treinish21905512015-07-13 10:33:35 -040019from oslo_serialization import jsonutils as json
Matthew Treinish9b896242014-04-23 21:25:27 +000020
Andrea Frittolib33dd462017-07-21 10:14:25 +010021from tempest import clients
Manik Bindlishebc7f5e2018-08-29 06:12:07 +000022from tempest.cmd import init
Matthew Treinish9b896242014-04-23 21:25:27 +000023from tempest.cmd import verify_tempest_config
Andrea Frittolib33dd462017-07-21 10:14:25 +010024from tempest.common import credentials_factory
Matthew Treinishd14c9df2014-04-27 00:54:25 -040025from tempest import config
Andrea Frittolib33dd462017-07-21 10:14:25 +010026from tempest.lib.common import rest_client
Brant Knudson28de8d52016-03-18 13:50:02 -050027from tempest.lib.common.utils import data_utils
Andrea Frittolib33dd462017-07-21 10:14:25 +010028from tempest.lib import exceptions as lib_exc
Matthew Treinishffad78a2016-04-16 14:39:52 -040029from tempest.tests import base
Matthew Treinishd14c9df2014-04-27 00:54:25 -040030from tempest.tests import fake_config
Matthew Treinish9b896242014-04-23 21:25:27 +000031
32
33class TestGetAPIVersions(base.TestCase):
34
Brant Knudson28de8d52016-03-18 13:50:02 -050035 def test_remove_version_project(self):
36 f = verify_tempest_config._remove_version_project
37 self.assertEqual('/', f('/v2.1/%s/' % data_utils.rand_uuid_hex()))
38 self.assertEqual('', f('/v2.1/tenant_id'))
39 self.assertEqual('', f('/v3'))
40 self.assertEqual('/', f('/v3/'))
41 self.assertEqual('/something/', f('/something/v2.1/tenant_id/'))
42 self.assertEqual('/something', f('/something/v2.1/tenant_id'))
43 self.assertEqual('/something', f('/something/v3'))
44 self.assertEqual('/something/', f('/something/v3/'))
45 self.assertEqual('/', f('/')) # http://localhost/
46 self.assertEqual('', f('')) # http://localhost
47
Matthew Treinish9b896242014-04-23 21:25:27 +000048 def test_url_grab_versioned_nova_nossl(self):
49 base_url = 'http://127.0.0.1:8774/v2/'
50 endpoint = verify_tempest_config._get_unversioned_endpoint(base_url)
Brant Knudson28de8d52016-03-18 13:50:02 -050051 self.assertEqual('http://127.0.0.1:8774/', endpoint)
Matthew Treinish9b896242014-04-23 21:25:27 +000052
53 def test_url_grab_versioned_nova_ssl(self):
54 base_url = 'https://127.0.0.1:8774/v3/'
55 endpoint = verify_tempest_config._get_unversioned_endpoint(base_url)
Brant Knudson28de8d52016-03-18 13:50:02 -050056 self.assertEqual('https://127.0.0.1:8774/', endpoint)
57
58 def test_get_unversioned_endpoint_base(self):
59 base_url = 'https://127.0.0.1:5000/'
60 endpoint = verify_tempest_config._get_unversioned_endpoint(base_url)
61 self.assertEqual('https://127.0.0.1:5000/', endpoint)
62
63 def test_get_unversioned_endpoint_subpath(self):
64 base_url = 'https://127.0.0.1/identity/v3'
65 endpoint = verify_tempest_config._get_unversioned_endpoint(base_url)
66 self.assertEqual('https://127.0.0.1/identity', endpoint)
67
68 def test_get_unversioned_endpoint_subpath_trailing_solidus(self):
69 base_url = 'https://127.0.0.1/identity/v3/'
70 endpoint = verify_tempest_config._get_unversioned_endpoint(base_url)
71 self.assertEqual('https://127.0.0.1/identity/', endpoint)
Matthew Treinishd14c9df2014-04-27 00:54:25 -040072
73
74class TestDiscovery(base.TestCase):
75
76 def setUp(self):
77 super(TestDiscovery, self).setUp()
78 self.useFixture(fake_config.ConfigFixture())
Jordan Pittier0021c292016-03-29 21:33:34 +020079 self.patchobject(config, 'TempestConfigPrivate',
80 fake_config.FakePrivate)
Matthew Treinishd14c9df2014-04-27 00:54:25 -040081
82 def test_get_keystone_api_versions(self):
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +070083 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishd14c9df2014-04-27 00:54:25 -040084 verify_tempest_config, '_get_unversioned_endpoint',
85 return_value='http://fake_endpoint:5000'))
86 fake_resp = {'versions': {'values': [{'id': 'v2.0'}, {'id': 'v3.0'}]}}
87 fake_resp = json.dumps(fake_resp)
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +070088 self.useFixture(fixtures.MockPatch(
Jordan Pittier00f25962016-03-18 17:10:07 +010089 'tempest.lib.common.http.ClosingHttp.request',
90 return_value=(None, fake_resp)))
Matthew Treinishd14c9df2014-04-27 00:54:25 -040091 fake_os = mock.MagicMock()
92 versions = verify_tempest_config._get_api_versions(fake_os, 'keystone')
93 self.assertIn('v2.0', versions)
94 self.assertIn('v3.0', versions)
95
96 def test_get_cinder_api_versions(self):
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +070097 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishd14c9df2014-04-27 00:54:25 -040098 verify_tempest_config, '_get_unversioned_endpoint',
99 return_value='http://fake_endpoint:5000'))
100 fake_resp = {'versions': [{'id': 'v1.0'}, {'id': 'v2.0'}]}
101 fake_resp = json.dumps(fake_resp)
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700102 self.useFixture(fixtures.MockPatch(
Jordan Pittier00f25962016-03-18 17:10:07 +0100103 'tempest.lib.common.http.ClosingHttp.request',
104 return_value=(None, fake_resp)))
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400105 fake_os = mock.MagicMock()
106 versions = verify_tempest_config._get_api_versions(fake_os, 'cinder')
107 self.assertIn('v1.0', versions)
108 self.assertIn('v2.0', versions)
109
110 def test_get_nova_versions(self):
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700111 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400112 verify_tempest_config, '_get_unversioned_endpoint',
113 return_value='http://fake_endpoint:5000'))
114 fake_resp = {'versions': [{'id': 'v2.0'}, {'id': 'v3.0'}]}
115 fake_resp = json.dumps(fake_resp)
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700116 self.useFixture(fixtures.MockPatch(
Jordan Pittier00f25962016-03-18 17:10:07 +0100117 'tempest.lib.common.http.ClosingHttp.request',
118 return_value=(None, fake_resp)))
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400119 fake_os = mock.MagicMock()
120 versions = verify_tempest_config._get_api_versions(fake_os, 'nova')
121 self.assertIn('v2.0', versions)
122 self.assertIn('v3.0', versions)
123
Brant Knudson5a59f872016-03-18 13:07:00 -0500124 def test_get_versions_invalid_response(self):
125 # When the response doesn't contain a JSON response, an error is
126 # logged.
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700127 mock_log_error = self.useFixture(fixtures.MockPatchObject(
Brant Knudson5a59f872016-03-18 13:07:00 -0500128 verify_tempest_config.LOG, 'error')).mock
129
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700130 self.useFixture(fixtures.MockPatchObject(
Brant Knudson5a59f872016-03-18 13:07:00 -0500131 verify_tempest_config, '_get_unversioned_endpoint'))
132
133 # Simulated response is not JSON.
134 sample_body = (
135 '<html><head>Sample Response</head><body>This is the sample page '
136 'for the web server. Why are you requesting it?</body></html>')
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700137 self.useFixture(fixtures.MockPatch(
Jordan Pittier00f25962016-03-18 17:10:07 +0100138 'tempest.lib.common.http.ClosingHttp.request',
139 return_value=(None, sample_body)))
Brant Knudson5a59f872016-03-18 13:07:00 -0500140
141 # service value doesn't matter, just needs to match what
142 # _get_api_versions puts in its client_dict.
143 self.assertRaises(ValueError, verify_tempest_config._get_api_versions,
144 os=mock.MagicMock(), service='keystone')
145 self.assertTrue(mock_log_error.called)
146
Adam Gandelman03af5562014-10-07 12:22:48 -0700147 def test_verify_api_versions(self):
Ken'ichi Ohmichia58c1562014-12-15 00:39:55 +0000148 api_services = ['cinder', 'glance', 'keystone']
Adam Gandelman03af5562014-10-07 12:22:48 -0700149 fake_os = mock.MagicMock()
150 for svc in api_services:
151 m = 'verify_%s_api_versions' % svc
152 with mock.patch.object(verify_tempest_config, m) as verify_mock:
153 verify_tempest_config.verify_api_versions(fake_os, svc, True)
154 verify_mock.assert_called_once_with(fake_os, True)
155
156 def test_verify_api_versions_not_implemented(self):
Ken'ichi Ohmichia58c1562014-12-15 00:39:55 +0000157 api_services = ['cinder', 'glance', 'keystone']
Adam Gandelman03af5562014-10-07 12:22:48 -0700158 fake_os = mock.MagicMock()
159 for svc in api_services:
160 m = 'verify_%s_api_versions' % svc
161 with mock.patch.object(verify_tempest_config, m) as verify_mock:
162 verify_tempest_config.verify_api_versions(fake_os, 'foo', True)
163 self.assertFalse(verify_mock.called)
164
Jordan Pittier00f25962016-03-18 17:10:07 +0100165 @mock.patch('tempest.lib.common.http.ClosingHttp.request')
166 def test_verify_keystone_api_versions_no_v3(self, mock_request):
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700167 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400168 verify_tempest_config, '_get_unversioned_endpoint',
169 return_value='http://fake_endpoint:5000'))
170 fake_resp = {'versions': {'values': [{'id': 'v2.0'}]}}
171 fake_resp = json.dumps(fake_resp)
Jordan Pittier00f25962016-03-18 17:10:07 +0100172 mock_request.return_value = (None, fake_resp)
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400173 fake_os = mock.MagicMock()
174 with mock.patch.object(verify_tempest_config,
175 'print_and_or_update') as print_mock:
176 verify_tempest_config.verify_keystone_api_versions(fake_os, True)
177 print_mock.assert_called_once_with('api_v3',
Nikita Gerasimov35fbdc12015-08-07 19:58:24 +0300178 'identity-feature-enabled',
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400179 False, True)
180
Jordan Pittier00f25962016-03-18 17:10:07 +0100181 @mock.patch('tempest.lib.common.http.ClosingHttp.request')
Nikita Gerasimov3b169cc2016-08-10 17:10:42 +0300182 def test_verify_cinder_api_versions_no_v3(self, mock_request):
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700183 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400184 verify_tempest_config, '_get_unversioned_endpoint',
185 return_value='http://fake_endpoint:5000'))
Ken'ichi Ohmichi7a0811e2017-03-15 17:32:09 -0700186 fake_resp = {'versions': [{'id': 'v2.0'}]}
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400187 fake_resp = json.dumps(fake_resp)
Jordan Pittier00f25962016-03-18 17:10:07 +0100188 mock_request.return_value = (None, fake_resp)
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400189 fake_os = mock.MagicMock()
190 with mock.patch.object(verify_tempest_config,
191 'print_and_or_update') as print_mock:
192 verify_tempest_config.verify_cinder_api_versions(fake_os, True)
Ken'ichi Ohmichi0f107bc2017-03-17 09:55:55 -0700193 print_mock.assert_any_call('api_v3', 'volume-feature-enabled',
194 False, True)
195 self.assertEqual(1, print_mock.call_count)
Nikita Gerasimov3b169cc2016-08-10 17:10:42 +0300196
197 @mock.patch('tempest.lib.common.http.ClosingHttp.request')
198 def test_verify_cinder_api_versions_no_v2(self, mock_request):
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700199 self.useFixture(fixtures.MockPatchObject(
Nikita Gerasimov3b169cc2016-08-10 17:10:42 +0300200 verify_tempest_config, '_get_unversioned_endpoint',
201 return_value='http://fake_endpoint:5000'))
Ken'ichi Ohmichi7a0811e2017-03-15 17:32:09 -0700202 fake_resp = {'versions': [{'id': 'v3.0'}]}
Nikita Gerasimov3b169cc2016-08-10 17:10:42 +0300203 fake_resp = json.dumps(fake_resp)
204 mock_request.return_value = (None, fake_resp)
205 fake_os = mock.MagicMock()
206 with mock.patch.object(verify_tempest_config,
207 'print_and_or_update') as print_mock:
208 verify_tempest_config.verify_cinder_api_versions(fake_os, True)
209 print_mock.assert_any_call('api_v2', 'volume-feature-enabled',
210 False, True)
Ken'ichi Ohmichi0f107bc2017-03-17 09:55:55 -0700211 self.assertEqual(1, print_mock.call_count)
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400212
Jordan Pittier00f25962016-03-18 17:10:07 +0100213 @mock.patch('tempest.lib.common.http.ClosingHttp.request')
214 def test_verify_cinder_api_versions_no_v1(self, mock_request):
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700215 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400216 verify_tempest_config, '_get_unversioned_endpoint',
217 return_value='http://fake_endpoint:5000'))
Nikita Gerasimov3b169cc2016-08-10 17:10:42 +0300218 fake_resp = {'versions': [{'id': 'v2.0'}, {'id': 'v3.0'}]}
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400219 fake_resp = json.dumps(fake_resp)
Jordan Pittier00f25962016-03-18 17:10:07 +0100220 mock_request.return_value = (None, fake_resp)
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400221 fake_os = mock.MagicMock()
222 with mock.patch.object(verify_tempest_config,
223 'print_and_or_update') as print_mock:
224 verify_tempest_config.verify_cinder_api_versions(fake_os, True)
Ken'ichi Ohmichi0f107bc2017-03-17 09:55:55 -0700225 print_mock.assert_not_called()
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400226
Julien Danjou99518762016-09-19 17:58:25 +0200227 def test_verify_glance_version_no_v2_with_v1_1(self):
Andrea Frittolib33dd462017-07-21 10:14:25 +0100228 # This test verifies that wrong config api_v2 = True is detected
229 class FakeClient(object):
230 def get_versions(self):
Manik Bindlish68bf3752018-08-08 11:10:38 +0000231 return (None, ['v1.1'])
Andrea Frittolib33dd462017-07-21 10:14:25 +0100232
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400233 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100234 fake_module = mock.MagicMock()
235 fake_module.ImagesClient = FakeClient
236 fake_os.image_v1 = fake_module
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400237 with mock.patch.object(verify_tempest_config,
238 'print_and_or_update') as print_mock:
239 verify_tempest_config.verify_glance_api_versions(fake_os, True)
zhufldc68af72018-09-05 15:47:39 +0800240 print_mock.assert_called_with('api_v2', 'image-feature-enabled',
241 False, True)
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400242
Julien Danjou99518762016-09-19 17:58:25 +0200243 def test_verify_glance_version_no_v2_with_v1_0(self):
Andrea Frittolib33dd462017-07-21 10:14:25 +0100244 # This test verifies that wrong config api_v2 = True is detected
245 class FakeClient(object):
246 def get_versions(self):
247 return (None, ['v1.0'])
248
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400249 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100250 fake_module = mock.MagicMock()
251 fake_module.ImagesClient = FakeClient
252 fake_os.image_v1 = fake_module
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400253 with mock.patch.object(verify_tempest_config,
254 'print_and_or_update') as print_mock:
255 verify_tempest_config.verify_glance_api_versions(fake_os, True)
zhufldc68af72018-09-05 15:47:39 +0800256 print_mock.assert_called_with('api_v2', 'image-feature-enabled',
257 False, True)
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400258
Julien Danjou99518762016-09-19 17:58:25 +0200259 def test_verify_glance_version_no_v1(self):
Andrea Frittolib33dd462017-07-21 10:14:25 +0100260 # This test verifies that wrong config api_v1 = True is detected
261 class FakeClient(object):
262 def get_versions(self):
263 raise lib_exc.NotFound()
264
265 def list_versions(self):
266 return {'versions': [{'id': 'v2.0'}]}
267
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400268 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100269 fake_module = mock.MagicMock()
270 fake_module.ImagesClient = FakeClient
271 fake_module.VersionsClient = FakeClient
272 fake_os.image_v1 = fake_module
273 fake_os.image_v2 = fake_module
Matthew Treinishd14c9df2014-04-27 00:54:25 -0400274 with mock.patch.object(verify_tempest_config,
275 'print_and_or_update') as print_mock:
276 verify_tempest_config.verify_glance_api_versions(fake_os, True)
zhufldc68af72018-09-05 15:47:39 +0800277 print_mock.assert_not_called()
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400278
Andrea Frittolib33dd462017-07-21 10:14:25 +0100279 def test_verify_glance_version_no_version(self):
280 # This test verifies that wrong config api_v1 = True is detected
281 class FakeClient(object):
282 def get_versions(self):
283 raise lib_exc.NotFound()
284
285 def list_versions(self):
286 raise lib_exc.NotFound()
287
288 fake_os = mock.MagicMock()
289 fake_module = mock.MagicMock()
290 fake_module.ImagesClient = FakeClient
291 fake_module.VersionsClient = FakeClient
292 fake_os.image_v1 = fake_module
293 fake_os.image_v2 = fake_module
294 with mock.patch.object(verify_tempest_config,
295 'print_and_or_update') as print_mock:
296 verify_tempest_config.verify_glance_api_versions(fake_os, True)
297 print_mock.assert_called_once_with('glance',
298 'service-available',
299 False, True)
300
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400301 def test_verify_extensions_neutron(self):
302 def fake_list_extensions():
David Kranz34e88122014-12-11 15:24:05 -0500303 return {'extensions': [{'alias': 'fake1'},
304 {'alias': 'fake2'},
305 {'alias': 'not_fake'}]}
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400306 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100307 fake_client = mock.MagicMock()
308 fake_client.list_extensions = fake_list_extensions
309 self.useFixture(fixtures.MockPatchObject(
310 verify_tempest_config, 'get_extension_client',
311 return_value=fake_client))
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700312 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400313 verify_tempest_config, 'get_enabled_extensions',
314 return_value=(['fake1', 'fake2', 'fake3'])))
315 results = verify_tempest_config.verify_extensions(fake_os,
316 'neutron', {})
317 self.assertIn('neutron', results)
318 self.assertIn('fake1', results['neutron'])
319 self.assertTrue(results['neutron']['fake1'])
320 self.assertIn('fake2', results['neutron'])
321 self.assertTrue(results['neutron']['fake2'])
322 self.assertIn('fake3', results['neutron'])
323 self.assertFalse(results['neutron']['fake3'])
324 self.assertIn('not_fake', results['neutron'])
325 self.assertFalse(results['neutron']['not_fake'])
326
327 def test_verify_extensions_neutron_all(self):
328 def fake_list_extensions():
David Kranz34e88122014-12-11 15:24:05 -0500329 return {'extensions': [{'alias': 'fake1'},
330 {'alias': 'fake2'},
331 {'alias': 'not_fake'}]}
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400332 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100333 fake_client = mock.MagicMock()
334 fake_client.list_extensions = fake_list_extensions
335 self.useFixture(fixtures.MockPatchObject(
336 verify_tempest_config, 'get_extension_client',
337 return_value=fake_client))
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700338 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400339 verify_tempest_config, 'get_enabled_extensions',
340 return_value=(['all'])))
341 results = verify_tempest_config.verify_extensions(fake_os,
342 'neutron', {})
343 self.assertIn('neutron', results)
344 self.assertIn('extensions', results['neutron'])
Matthew Treinish6bbc8742014-08-25 18:28:15 -0400345 self.assertEqual(sorted(['fake1', 'fake2', 'not_fake']),
346 sorted(results['neutron']['extensions']))
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400347
Martin Kopecd7e05dd2018-08-14 09:20:48 +0000348 def test_verify_extensions_neutron_none(self):
349 def fake_list_extensions():
350 return {'extensions': []}
351 fake_os = mock.MagicMock()
352 fake_client = mock.MagicMock()
353 fake_client.list_extensions = fake_list_extensions
354 self.useFixture(fixtures.MockPatchObject(
355 verify_tempest_config, 'get_extension_client',
356 return_value=fake_client))
357 self.useFixture(fixtures.MockPatchObject(
358 verify_tempest_config, 'get_enabled_extensions',
359 return_value=(['all'])))
360 results = verify_tempest_config.verify_extensions(fake_os,
361 'neutron', {})
362 self.assertIn('neutron', results)
363 self.assertIn('extensions', results['neutron'])
364 self.assertEqual([], results['neutron']['extensions'])
365
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400366 def test_verify_extensions_cinder(self):
367 def fake_list_extensions():
Joseph Lanoux6809bab2014-12-18 14:57:18 +0000368 return {'extensions': [{'alias': 'fake1'},
369 {'alias': 'fake2'},
370 {'alias': 'not_fake'}]}
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400371 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100372 fake_client = mock.MagicMock()
373 fake_client.list_extensions = fake_list_extensions
374 self.useFixture(fixtures.MockPatchObject(
375 verify_tempest_config, 'get_extension_client',
376 return_value=fake_client))
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700377 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400378 verify_tempest_config, 'get_enabled_extensions',
379 return_value=(['fake1', 'fake2', 'fake3'])))
380 results = verify_tempest_config.verify_extensions(fake_os,
381 'cinder', {})
Andrea Frittolib33dd462017-07-21 10:14:25 +0100382
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400383 self.assertIn('cinder', results)
384 self.assertIn('fake1', results['cinder'])
385 self.assertTrue(results['cinder']['fake1'])
386 self.assertIn('fake2', results['cinder'])
387 self.assertTrue(results['cinder']['fake2'])
388 self.assertIn('fake3', results['cinder'])
389 self.assertFalse(results['cinder']['fake3'])
390 self.assertIn('not_fake', results['cinder'])
391 self.assertFalse(results['cinder']['not_fake'])
392
393 def test_verify_extensions_cinder_all(self):
394 def fake_list_extensions():
Joseph Lanoux6809bab2014-12-18 14:57:18 +0000395 return {'extensions': [{'alias': 'fake1'},
396 {'alias': 'fake2'},
397 {'alias': 'not_fake'}]}
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400398 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100399 fake_client = mock.MagicMock()
400 fake_client.list_extensions = fake_list_extensions
401 self.useFixture(fixtures.MockPatchObject(
402 verify_tempest_config, 'get_extension_client',
403 return_value=fake_client))
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700404 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400405 verify_tempest_config, 'get_enabled_extensions',
406 return_value=(['all'])))
407 results = verify_tempest_config.verify_extensions(fake_os,
408 'cinder', {})
409 self.assertIn('cinder', results)
410 self.assertIn('extensions', results['cinder'])
Matthew Treinish6bbc8742014-08-25 18:28:15 -0400411 self.assertEqual(sorted(['fake1', 'fake2', 'not_fake']),
412 sorted(results['cinder']['extensions']))
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400413
Martin Kopecd7e05dd2018-08-14 09:20:48 +0000414 def test_verify_extensions_cinder_none(self):
415 def fake_list_extensions():
416 return {'extensions': []}
417 fake_os = mock.MagicMock()
418 fake_client = mock.MagicMock()
419 fake_client.list_extensions = fake_list_extensions
420 self.useFixture(fixtures.MockPatchObject(
421 verify_tempest_config, 'get_extension_client',
422 return_value=fake_client))
423 self.useFixture(fixtures.MockPatchObject(
424 verify_tempest_config, 'get_enabled_extensions',
425 return_value=(['all'])))
426 results = verify_tempest_config.verify_extensions(fake_os,
427 'cinder', {})
428 self.assertIn('cinder', results)
429 self.assertIn('extensions', results['cinder'])
430 self.assertEqual([], results['cinder']['extensions'])
431
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400432 def test_verify_extensions_nova(self):
433 def fake_list_extensions():
David Kranz5cf4ba42015-02-10 14:00:50 -0500434 return ([{'alias': 'fake1'}, {'alias': 'fake2'},
435 {'alias': 'not_fake'}])
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400436 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100437 fake_client = mock.MagicMock()
438 fake_client.list_extensions = fake_list_extensions
439 self.useFixture(fixtures.MockPatchObject(
440 verify_tempest_config, 'get_extension_client',
441 return_value=fake_client))
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700442 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400443 verify_tempest_config, 'get_enabled_extensions',
444 return_value=(['fake1', 'fake2', 'fake3'])))
445 results = verify_tempest_config.verify_extensions(fake_os,
446 'nova', {})
447 self.assertIn('nova', results)
448 self.assertIn('fake1', results['nova'])
449 self.assertTrue(results['nova']['fake1'])
450 self.assertIn('fake2', results['nova'])
451 self.assertTrue(results['nova']['fake2'])
452 self.assertIn('fake3', results['nova'])
453 self.assertFalse(results['nova']['fake3'])
454 self.assertIn('not_fake', results['nova'])
455 self.assertFalse(results['nova']['not_fake'])
456
457 def test_verify_extensions_nova_all(self):
458 def fake_list_extensions():
David Kranz5cf4ba42015-02-10 14:00:50 -0500459 return ({'extensions': [{'alias': 'fake1'},
460 {'alias': 'fake2'},
461 {'alias': 'not_fake'}]})
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400462 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100463 fake_client = mock.MagicMock()
464 fake_client.list_extensions = fake_list_extensions
465 self.useFixture(fixtures.MockPatchObject(
466 verify_tempest_config, 'get_extension_client',
467 return_value=fake_client))
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700468 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400469 verify_tempest_config, 'get_enabled_extensions',
470 return_value=(['all'])))
471 results = verify_tempest_config.verify_extensions(fake_os,
472 'nova', {})
473 self.assertIn('nova', results)
474 self.assertIn('extensions', results['nova'])
Matthew Treinish6bbc8742014-08-25 18:28:15 -0400475 self.assertEqual(sorted(['fake1', 'fake2', 'not_fake']),
476 sorted(results['nova']['extensions']))
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400477
Martin Kopecd7e05dd2018-08-14 09:20:48 +0000478 def test_verify_extensions_nova_none(self):
479 def fake_list_extensions():
480 return ({'extensions': []})
481 fake_os = mock.MagicMock()
482 fake_client = mock.MagicMock()
483 fake_client.list_extensions = fake_list_extensions
484 self.useFixture(fixtures.MockPatchObject(
485 verify_tempest_config, 'get_extension_client',
486 return_value=fake_client))
487 self.useFixture(fixtures.MockPatchObject(
488 verify_tempest_config, 'get_enabled_extensions',
489 return_value=(['all'])))
490 results = verify_tempest_config.verify_extensions(fake_os,
491 'nova', {})
492 self.assertIn('nova', results)
493 self.assertIn('extensions', results['nova'])
494 self.assertEqual([], results['nova']['extensions'])
495
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400496 def test_verify_extensions_swift(self):
497 def fake_list_extensions():
ghanshyam17d8a482017-07-21 03:10:48 +0000498 return {'fake1': 'metadata',
499 'fake2': 'metadata',
500 'not_fake': 'metadata',
501 'swift': 'metadata'}
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400502 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100503 fake_client = mock.MagicMock()
504 fake_client.list_capabilities = fake_list_extensions
505 self.useFixture(fixtures.MockPatchObject(
506 verify_tempest_config, 'get_extension_client',
507 return_value=fake_client))
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700508 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400509 verify_tempest_config, 'get_enabled_extensions',
510 return_value=(['fake1', 'fake2', 'fake3'])))
511 results = verify_tempest_config.verify_extensions(fake_os, 'swift', {})
512 self.assertIn('swift', results)
513 self.assertIn('fake1', results['swift'])
514 self.assertTrue(results['swift']['fake1'])
515 self.assertIn('fake2', results['swift'])
516 self.assertTrue(results['swift']['fake2'])
517 self.assertIn('fake3', results['swift'])
518 self.assertFalse(results['swift']['fake3'])
519 self.assertIn('not_fake', results['swift'])
520 self.assertFalse(results['swift']['not_fake'])
521
522 def test_verify_extensions_swift_all(self):
523 def fake_list_extensions():
ghanshyam17d8a482017-07-21 03:10:48 +0000524 return {'fake1': 'metadata',
525 'fake2': 'metadata',
526 'not_fake': 'metadata',
527 'swift': 'metadata'}
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400528 fake_os = mock.MagicMock()
Andrea Frittolib33dd462017-07-21 10:14:25 +0100529 fake_client = mock.MagicMock()
530 fake_client.list_capabilities = fake_list_extensions
531 self.useFixture(fixtures.MockPatchObject(
532 verify_tempest_config, 'get_extension_client',
533 return_value=fake_client))
Ngo Quoc Cuong33710b32017-05-11 14:17:17 +0700534 self.useFixture(fixtures.MockPatchObject(
Matthew Treinishfabe77c2014-04-27 10:38:00 -0400535 verify_tempest_config, 'get_enabled_extensions',
536 return_value=(['all'])))
537 results = verify_tempest_config.verify_extensions(fake_os,
538 'swift', {})
539 self.assertIn('swift', results)
540 self.assertIn('extensions', results['swift'])
Matthew Treinish6bbc8742014-08-25 18:28:15 -0400541 self.assertEqual(sorted(['not_fake', 'fake1', 'fake2']),
542 sorted(results['swift']['extensions']))
Andrea Frittolib33dd462017-07-21 10:14:25 +0100543
Martin Kopecd7e05dd2018-08-14 09:20:48 +0000544 def test_verify_extensions_swift_none(self):
545 def fake_list_extensions():
546 return {'swift': 'metadata'}
547 fake_os = mock.MagicMock()
548 fake_client = mock.MagicMock()
549 fake_client.list_capabilities = fake_list_extensions
550 self.useFixture(fixtures.MockPatchObject(
551 verify_tempest_config, 'get_extension_client',
552 return_value=fake_client))
553 self.useFixture(fixtures.MockPatchObject(
554 verify_tempest_config, 'get_enabled_extensions',
555 return_value=(['all'])))
556 results = verify_tempest_config.verify_extensions(fake_os,
557 'swift', {})
558 self.assertIn('swift', results)
559 self.assertIn('extensions', results['swift'])
560 self.assertEqual([], results['swift']['extensions'])
561
Andrea Frittolib33dd462017-07-21 10:14:25 +0100562 def test_get_extension_client(self):
563 creds = credentials_factory.get_credentials(
564 fill_in=False, username='fake_user', project_name='fake_project',
565 password='fake_password')
566 os = clients.Manager(creds)
567 for service in ['nova', 'neutron', 'swift', 'cinder']:
568 extensions_client = verify_tempest_config.get_extension_client(
569 os, service)
570 self.assertIsInstance(extensions_client, rest_client.RestClient)
Manik Bindlishebc7f5e2018-08-29 06:12:07 +0000571
572 def test_get_extension_client_sysexit(self):
573 creds = credentials_factory.get_credentials(
574 fill_in=False, username='fake_user', project_name='fake_project',
575 password='fake_password')
576 os = clients.Manager(creds)
577 self.assertRaises(SystemExit,
578 verify_tempest_config.get_extension_client,
579 os, 'fakeservice')
580
581 def test_get_config_file(self):
582 default_config_dir = os.path.join(os.getcwd(), 'etc/')
583 default_config_file = "tempest.conf"
584 conf_dir = os.environ.get('TEMPEST_CONFIG_DIR', default_config_dir)
585 conf_file = os.environ.get('TEMPEST_CONFIG', default_config_file)
586 local_sample_conf_file = os.path.join(conf_dir, conf_file)
587
588 init_cmd = init.TempestInit(None, None)
589 init_cmd.generate_sample_config(os.getcwd())
590 self.assertTrue(
591 os.path.isfile('%s/tempest.conf.sample' % (conf_dir)))
592 os.rename('%s/tempest.conf.sample'
593 % (conf_dir), '%s' % (local_sample_conf_file))
594
595 def fake_environ_get(key, default):
596 return default
597
598 with mock.patch('os.environ.get', side_effect=fake_environ_get):
599 file_pointer = verify_tempest_config._get_config_file()
600 self.assertEqual(local_sample_conf_file, file_pointer.name)
601
602 with open(local_sample_conf_file, 'r+') as f:
603 local_sample_conf_contents = f.read()
604 self.assertEqual(local_sample_conf_contents, file_pointer.read())
605
606 def test_print_and_or_update_true(self):
607 with mock.patch.object(
608 verify_tempest_config, 'change_option') as test_mock:
609 verify_tempest_config.print_and_or_update(
610 'fakeservice', 'fake-service-available', False, True)
611 test_mock.assert_called_once_with(
612 'fakeservice', 'fake-service-available', False)
613
614 def test_print_and_or_update_false(self):
615 with mock.patch.object(
616 verify_tempest_config, 'change_option') as test_mock:
617 verify_tempest_config.print_and_or_update(
618 'fakeservice', 'fake-service-available', False, False)
619 test_mock.assert_not_called()
620
621 def test_contains_version_positive_data(self):
622 self.assertTrue(
623 verify_tempest_config.contains_version('v1.', ['v1.0', 'v2.0']))
624
625 def test_contains_version_negative_data(self):
626 self.assertFalse(
627 verify_tempest_config.contains_version('v5.', ['v1.0', 'v2.0']))