blob: 388b9b0e3a0baf51183861f4a59d0b6535a8e4e9 [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Jay Pipes13b479b2012-06-11 14:52:27 -04002# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Ghanshyam3390d9f2015-12-25 12:48:02 +090016import testtools
17
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.compute import base
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +000019from tempest.common import waiters
Ghanshyam3390d9f2015-12-25 12:48:02 +090020from tempest import config
Ken'ichi Ohmichi757833a2017-03-10 10:30:30 -080021from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080022from tempest.lib import decorators
Daryl Walleck1465d612011-11-02 02:22:15 -050023
Ghanshyam3390d9f2015-12-25 12:48:02 +090024CONF = config.CONF
25
Daryl Walleck1465d612011-11-02 02:22:15 -050026
ivan-zhuf2b00502013-10-18 10:06:52 +080027class ServersTestJSON(base.BaseV2ComputeTest):
zhuflef323632020-08-13 10:38:40 +080028 """Test servers API"""
Eric Friedbfaa50f2020-01-09 12:04:54 -060029 create_default_network = True
Attila Fazekas19044d52013-02-16 07:35:06 +010030
Ghanshyam Mann4091e982023-01-19 21:31:25 -060031 credentials = ['primary', 'project_reader']
32
Attila Fazekas19044d52013-02-16 07:35:06 +010033 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053034 def setup_clients(cls):
35 super(ServersTestJSON, cls).setup_clients()
Attila Fazekas19044d52013-02-16 07:35:06 +010036 cls.client = cls.servers_client
Ghanshyam Mann4091e982023-01-19 21:31:25 -060037 if CONF.enforce_scope.nova:
38 cls.reader_client = cls.os_project_reader.servers_client
39 else:
40 cls.reader_client = cls.client
Daryl Walleck1465d612011-11-02 02:22:15 -050041
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080042 @decorators.idempotent_id('b92d5ec7-b1dd-44a2-87e4-45e888c46ef0')
Ghanshyam3390d9f2015-12-25 12:48:02 +090043 @testtools.skipUnless(CONF.compute_feature_enabled.
44 enable_instance_password,
45 'Instance password not available.')
Daryl Walleck1465d612011-11-02 02:22:15 -050046 def test_create_server_with_admin_password(self):
zhuflef323632020-08-13 10:38:40 +080047 """Test creating server with admin password
48
49 If an admin password is provided on server creation, the server's
50 root password should be set to that password.
51 """
David Kranz0fb14292015-02-11 15:55:20 -050052 server = self.create_test_server(adminPass='testpassword')
zhufl196ab8a2018-10-30 10:48:37 +080053 self.addCleanup(self.delete_server, server['id'])
Daryl Walleck1465d612011-11-02 02:22:15 -050054
Sean Dagueab277ad2013-03-15 15:59:06 -040055 # Verify the password is set correctly in the response
56 self.assertEqual('testpassword', server['adminPass'])
Daryl Walleck1465d612011-11-02 02:22:15 -050057
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080058 @decorators.idempotent_id('8fea6be7-065e-47cf-89b8-496e6f96c699')
Rohit Karajgidc300b22012-05-04 08:11:00 -070059 def test_create_with_existing_server_name(self):
zhuflef323632020-08-13 10:38:40 +080060 """Test creating a server with already existing name is allowed"""
Sean Dague22897e12013-02-25 17:54:09 -050061 # TODO(sdague): clear out try, we do cleanup one layer up
zhuflc6ce5392016-08-17 14:34:37 +080062 server_name = data_utils.rand_name(
63 self.__class__.__name__ + '-server')
David Kranz0fb14292015-02-11 15:55:20 -050064 server = self.create_test_server(name=server_name,
65 wait_until='ACTIVE')
Sean Dagueab277ad2013-03-15 15:59:06 -040066 id1 = server['id']
zhufl196ab8a2018-10-30 10:48:37 +080067 self.addCleanup(self.delete_server, id1)
David Kranz0fb14292015-02-11 15:55:20 -050068 server = self.create_test_server(name=server_name,
69 wait_until='ACTIVE')
Sean Dagueab277ad2013-03-15 15:59:06 -040070 id2 = server['id']
zhufl196ab8a2018-10-30 10:48:37 +080071 self.addCleanup(self.delete_server, id2)
Sean Dagueab277ad2013-03-15 15:59:06 -040072 self.assertNotEqual(id1, id2, "Did not create a new server")
Ghanshyam Mann4091e982023-01-19 21:31:25 -060073 server = self.reader_client.show_server(id1)['server']
Sean Dagueab277ad2013-03-15 15:59:06 -040074 name1 = server['name']
Ghanshyam Mann4091e982023-01-19 21:31:25 -060075 server = self.reader_client.show_server(id2)['server']
Sean Dagueab277ad2013-03-15 15:59:06 -040076 name2 = server['name']
77 self.assertEqual(name1, name2)
Rohit Karajgidc300b22012-05-04 08:11:00 -070078
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080079 @decorators.idempotent_id('f9e15296-d7f9-4e62-b53f-a04e89160833')
Rohit Karajgidc300b22012-05-04 08:11:00 -070080 def test_create_specify_keypair(self):
zhuflef323632020-08-13 10:38:40 +080081 """Test creating server with keypair"""
Masayuki Igawa259c1132013-10-31 17:48:44 +090082 key_name = data_utils.rand_name('key')
Ken'ichi Ohmichie364bce2015-07-17 10:27:59 +000083 self.keypairs_client.create_keypair(name=key_name)
ahmad525a5bc2015-05-12 10:43:02 +053084 self.addCleanup(self.keypairs_client.delete_keypair, key_name)
David Kranz173f0e02015-02-06 13:47:57 -050085 self.keypairs_client.list_keypairs()
zhufl196ab8a2018-10-30 10:48:37 +080086 server = self.create_test_server(key_name=key_name,
87 wait_until='ACTIVE')
88 self.addCleanup(self.delete_server, server['id'])
Ghanshyam Mann4091e982023-01-19 21:31:25 -060089 server = self.reader_client.show_server(server['id'])['server']
Sean Dagueab277ad2013-03-15 15:59:06 -040090 self.assertEqual(key_name, server['key_name'])
Rohit Karajgidc300b22012-05-04 08:11:00 -070091
Alexander Gubanov145258f2015-11-24 15:06:27 +020092 def _update_server_name(self, server_id, status, prefix_name='server'):
Anh Trand44a8be2016-03-25 09:49:14 +070093 # The server name should be changed to the provided value
Alexander Gubanov145258f2015-11-24 15:06:27 +020094 new_name = data_utils.rand_name(prefix_name)
95
Ghanshyam03d4dfd2014-05-26 14:20:37 +090096 # Update the server with a new name
David Kranz0fb14292015-02-11 15:55:20 -050097 self.client.update_server(server_id,
98 name=new_name)
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +000099 waiters.wait_for_server_status(self.client, server_id, status)
Ghanshyam03d4dfd2014-05-26 14:20:37 +0900100
101 # Verify the name of the server has changed
Ghanshyam Mann4091e982023-01-19 21:31:25 -0600102 server = self.reader_client.show_server(server_id)['server']
Ghanshyam03d4dfd2014-05-26 14:20:37 +0900103 self.assertEqual(new_name, server['name'])
104 return server
105
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800106 @decorators.idempotent_id('5e6ccff8-349d-4852-a8b3-055df7988dd2')
Daryl Walleck1465d612011-11-02 02:22:15 -0500107 def test_update_server_name(self):
zhuflef323632020-08-13 10:38:40 +0800108 """Test updating server name to the provided value"""
David Kranz0fb14292015-02-11 15:55:20 -0500109 server = self.create_test_server(wait_until='ACTIVE')
zhufl196ab8a2018-10-30 10:48:37 +0800110 self.addCleanup(self.delete_server, server['id'])
Alexander Gubanov145258f2015-11-24 15:06:27 +0200111 # Update instance name with non-ASCII characters
songwenpingc7845312021-01-04 02:57:38 +0000112 prefix_name = '\u00CD\u00F1st\u00E1\u00F1c\u00E9'
Alexander Gubanov145258f2015-11-24 15:06:27 +0200113 self._update_server_name(server['id'], 'ACTIVE', prefix_name)
Daryl Walleck1465d612011-11-02 02:22:15 -0500114
zhufl2ae6b902017-05-08 16:20:41 +0800115 # stop server and check server name update again
Ken'ichi Ohmichib2631082015-08-27 01:31:00 +0000116 self.client.stop_server(server['id'])
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000117 waiters.wait_for_server_status(self.client, server['id'], 'SHUTOFF')
Alexander Gubanov145258f2015-11-24 15:06:27 +0200118 # Update instance name with non-ASCII characters
Alexander Gubanov145258f2015-11-24 15:06:27 +0200119 updated_server = self._update_server_name(server['id'],
120 'SHUTOFF',
121 prefix_name)
Ghanshyam03d4dfd2014-05-26 14:20:37 +0900122 self.assertNotIn('progress', updated_server)
Daryl Walleck1465d612011-11-02 02:22:15 -0500123
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800124 @decorators.idempotent_id('89b90870-bc13-4b73-96af-f9d4f2b70077')
Daryl Walleck1465d612011-11-02 02:22:15 -0500125 def test_update_access_server_address(self):
zhuflef323632020-08-13 10:38:40 +0800126 """Test updating server's access addresses to the provided value"""
David Kranz0fb14292015-02-11 15:55:20 -0500127 server = self.create_test_server(wait_until='ACTIVE')
zhufl196ab8a2018-10-30 10:48:37 +0800128 self.addCleanup(self.delete_server, server['id'])
Daryl Walleck1465d612011-11-02 02:22:15 -0500129
Sean Dagueab277ad2013-03-15 15:59:06 -0400130 # Update the IPv4 and IPv6 access addresses
David Kranz0fb14292015-02-11 15:55:20 -0500131 self.client.update_server(server['id'],
132 accessIPv4='1.1.1.1',
133 accessIPv6='::babe:202:202')
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000134 waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
Daryl Walleck1465d612011-11-02 02:22:15 -0500135
Sean Dagueab277ad2013-03-15 15:59:06 -0400136 # Verify the access addresses have been updated
Ghanshyam Mann4091e982023-01-19 21:31:25 -0600137 server = self.reader_client.show_server(server['id'])['server']
Sean Dagueab277ad2013-03-15 15:59:06 -0400138 self.assertEqual('1.1.1.1', server['accessIPv4'])
139 self.assertEqual('::babe:202:202', server['accessIPv6'])
Rohit Karajgidc300b22012-05-04 08:11:00 -0700140
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800141 @decorators.idempotent_id('38fb1d02-c3c5-41de-91d3-9bc2025a75eb')
jun xie0ea79842013-09-26 21:57:44 +0800142 def test_create_server_with_ipv6_addr_only(self):
zhuflef323632020-08-13 10:38:40 +0800143 """Test creating server with ipv6 address only(no ipv4 address)"""
zhufl196ab8a2018-10-30 10:48:37 +0800144 server = self.create_test_server(accessIPv6='2001:2001::3',
145 wait_until='ACTIVE')
146 self.addCleanup(self.delete_server, server['id'])
Ghanshyam Mann4091e982023-01-19 21:31:25 -0600147 server = self.reader_client.show_server(server['id'])['server']
jun xie0ea79842013-09-26 21:57:44 +0800148 self.assertEqual('2001:2001::3', server['accessIPv6'])
Sergey Nikitin8654e5b2017-06-04 22:09:56 +0400149
Matt Riedemanna9487f92018-02-08 09:29:59 -0500150 @decorators.related_bug('1730756')
151 @decorators.idempotent_id('defbaca5-d611-49f5-ae21-56ee25d2db49')
152 def test_create_server_specify_multibyte_character_name(self):
zhuflef323632020-08-13 10:38:40 +0800153 """Test creating server with multi character name
Matt Riedemanna9487f92018-02-08 09:29:59 -0500154
zhuflef323632020-08-13 10:38:40 +0800155 prefix character is:
156 http://unicode.org/cldr/utility/character.jsp?a=20A1
157
158 We use a string with 3 byte utf-8 character due to nova
159 will return 400(Bad Request) if we attempt to send a name which has
160 4 byte utf-8 character.
161 """
Matt Riedemanna9487f92018-02-08 09:29:59 -0500162 utf8_name = data_utils.rand_name(b'\xe2\x82\xa1'.decode('utf-8'))
163 self.create_test_server(name=utf8_name, wait_until='ACTIVE')
164
Sergey Nikitin8654e5b2017-06-04 22:09:56 +0400165
166class ServerShowV247Test(base.BaseV2ComputeTest):
zhuflef323632020-08-13 10:38:40 +0800167 """Test servers API with compute microversion greater than 2.46"""
168
Sergey Nikitin8654e5b2017-06-04 22:09:56 +0400169 min_microversion = '2.47'
170 max_microversion = 'latest'
171
ghanshyama8ace722018-04-20 08:45:10 +0000172 # NOTE(gmann): This test tests the server APIs response schema
173 # Along with 2.47 microversion schema this test class tests the
174 # other microversions 2.9, 2.19 and 2.26 server APIs response schema
175 # also. 2.47 APIs schema are on top of 2.9->2.19->2.26 schema so
176 # below tests cover all of the schema.
177
Ghanshyam Mann4091e982023-01-19 21:31:25 -0600178 credentials = ['primary', 'project_reader']
179
180 @classmethod
181 def setup_clients(cls):
182 super(ServerShowV247Test, cls).setup_clients()
183 if CONF.enforce_scope.nova:
184 cls.reader_client = cls.os_project_reader.servers_client
185 else:
186 cls.reader_client = cls.servers_client
187
Sergey Nikitin8654e5b2017-06-04 22:09:56 +0400188 @decorators.idempotent_id('88b0bdb2-494c-11e7-a919-92ebcb67fe33')
189 def test_show_server(self):
zhuflef323632020-08-13 10:38:40 +0800190 """Test getting server detail"""
Sergey Nikitin8654e5b2017-06-04 22:09:56 +0400191 server = self.create_test_server()
192 # All fields will be checked by API schema
Ghanshyam Mann4091e982023-01-19 21:31:25 -0600193 self.reader_client.show_server(server['id'])
ghanshyama8ace722018-04-20 08:45:10 +0000194
195 @decorators.idempotent_id('8de397c2-57d0-4b90-aa30-e5d668f21a8b')
196 def test_update_rebuild_list_server(self):
zhuflef323632020-08-13 10:38:40 +0800197 """Test update/rebuild/list server"""
ghanshyama8ace722018-04-20 08:45:10 +0000198 server = self.create_test_server()
199 # Checking update API response schema
200 self.servers_client.update_server(server['id'])
201 waiters.wait_for_server_status(self.servers_client, server['id'],
202 'ACTIVE')
203 # Checking rebuild API response schema
204 self.servers_client.rebuild_server(server['id'], self.image_ref_alt)
205 waiters.wait_for_server_status(self.servers_client,
206 server['id'], 'ACTIVE')
207 # Checking list details API response schema
208 self.servers_client.list_servers(detail=True)
Jackie Truong1fa44642017-10-25 16:42:08 -0400209
210
211class ServerShowV263Test(base.BaseV2ComputeTest):
zhuflef323632020-08-13 10:38:40 +0800212 """Test servers API with compute microversion greater than 2.62"""
213
Jackie Truong1fa44642017-10-25 16:42:08 -0400214 min_microversion = '2.63'
215 max_microversion = 'latest'
216
Ghanshyam Mann4091e982023-01-19 21:31:25 -0600217 credentials = ['primary', 'project_reader']
218
219 @classmethod
220 def setup_clients(cls):
221 super(ServerShowV263Test, cls).setup_clients()
222 if CONF.enforce_scope.nova:
223 cls.reader_client = cls.os_project_reader.servers_client
224 else:
225 cls.reader_client = cls.servers_client
226
Lee Yarwood7f7c2322019-06-06 10:57:19 +0100227 @testtools.skipUnless(CONF.compute.certified_image_ref,
228 '``[compute]/certified_image_ref`` required to test '
229 'image certificate validation.')
230 @testtools.skipUnless(CONF.compute.certified_image_trusted_certs,
231 '``[compute]/certified_image_trusted_certs`` '
232 'required to test image certificate validation.')
Jackie Truong1fa44642017-10-25 16:42:08 -0400233 @decorators.idempotent_id('71b8e3d5-11d2-494f-b917-b094a4afed3c')
234 def test_show_update_rebuild_list_server(self):
zhuflef323632020-08-13 10:38:40 +0800235 """Test show/update/rebuild/list server"""
Lee Yarwood7f7c2322019-06-06 10:57:19 +0100236 trusted_certs = CONF.compute.certified_image_trusted_certs
Jackie Truong1fa44642017-10-25 16:42:08 -0400237 server = self.create_test_server(
Lee Yarwoodcff4ed72019-06-27 11:38:37 +0100238 image_id=CONF.compute.certified_image_ref,
Jackie Truong1fa44642017-10-25 16:42:08 -0400239 trusted_image_certificates=trusted_certs,
240 wait_until='ACTIVE')
241
242 # Check show API response schema
Ghanshyam Mann4091e982023-01-19 21:31:25 -0600243 self.reader_client.show_server(server['id'])['server']
Jackie Truong1fa44642017-10-25 16:42:08 -0400244
245 # Check update API response schema
246 self.servers_client.update_server(server['id'])
247 waiters.wait_for_server_status(self.servers_client,
248 server['id'], 'ACTIVE')
249
250 # Check rebuild API response schema
Martin Kopeccdd2b242019-08-12 20:11:56 +0000251 self.servers_client.rebuild_server(
252 server['id'], CONF.compute.certified_image_ref)
Jackie Truong1fa44642017-10-25 16:42:08 -0400253 waiters.wait_for_server_status(self.servers_client,
254 server['id'], 'ACTIVE')
255
256 # Check list details API response schema
257 params = {'trusted_image_certificates': trusted_certs}
258 servers = self.servers_client.list_servers(
259 detail=True, **params)['servers']
260 self.assertNotEmpty(servers)