blob: 56d973e0c42818a9891cbc0042b28c79fc56c85c [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
Andrea Frittoli0d0a3f32017-08-29 18:21:37 +010022from tempest.lib.common.utils import test_utils
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080023from tempest.lib import decorators
Daryl Walleck1465d612011-11-02 02:22:15 -050024
Ghanshyam3390d9f2015-12-25 12:48:02 +090025CONF = config.CONF
26
Daryl Walleck1465d612011-11-02 02:22:15 -050027
ivan-zhuf2b00502013-10-18 10:06:52 +080028class ServersTestJSON(base.BaseV2ComputeTest):
Attila Fazekas19044d52013-02-16 07:35:06 +010029
30 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053031 def setup_clients(cls):
32 super(ServersTestJSON, cls).setup_clients()
Attila Fazekas19044d52013-02-16 07:35:06 +010033 cls.client = cls.servers_client
Daryl Walleck1465d612011-11-02 02:22:15 -050034
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080035 @decorators.idempotent_id('b92d5ec7-b1dd-44a2-87e4-45e888c46ef0')
Ghanshyam3390d9f2015-12-25 12:48:02 +090036 @testtools.skipUnless(CONF.compute_feature_enabled.
37 enable_instance_password,
38 'Instance password not available.')
Daryl Walleck1465d612011-11-02 02:22:15 -050039 def test_create_server_with_admin_password(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050040 # If an admin password is provided on server creation, the server's
41 # root password should be set to that password.
David Kranz0fb14292015-02-11 15:55:20 -050042 server = self.create_test_server(adminPass='testpassword')
Andrea Frittoli0d0a3f32017-08-29 18:21:37 +010043 self.addCleanup(waiters.wait_for_server_termination,
44 self.servers_client, server['id'])
45 self.addCleanup(
46 test_utils.call_and_ignore_notfound_exc,
47 self.servers_client.delete_server, server['id'])
Daryl Walleck1465d612011-11-02 02:22:15 -050048
Sean Dagueab277ad2013-03-15 15:59:06 -040049 # Verify the password is set correctly in the response
50 self.assertEqual('testpassword', server['adminPass'])
Daryl Walleck1465d612011-11-02 02:22:15 -050051
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080052 @decorators.idempotent_id('8fea6be7-065e-47cf-89b8-496e6f96c699')
Rohit Karajgidc300b22012-05-04 08:11:00 -070053 def test_create_with_existing_server_name(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050054 # Creating a server with a name that already exists is allowed
Rohit Karajgidc300b22012-05-04 08:11:00 -070055
Sean Dague22897e12013-02-25 17:54:09 -050056 # TODO(sdague): clear out try, we do cleanup one layer up
zhuflc6ce5392016-08-17 14:34:37 +080057 server_name = data_utils.rand_name(
58 self.__class__.__name__ + '-server')
David Kranz0fb14292015-02-11 15:55:20 -050059 server = self.create_test_server(name=server_name,
60 wait_until='ACTIVE')
Sean Dagueab277ad2013-03-15 15:59:06 -040061 id1 = server['id']
Andrea Frittoli0d0a3f32017-08-29 18:21:37 +010062 self.addCleanup(waiters.wait_for_server_termination,
63 self.servers_client, id1)
64 self.addCleanup(
65 test_utils.call_and_ignore_notfound_exc,
66 self.servers_client.delete_server, id1)
David Kranz0fb14292015-02-11 15:55:20 -050067 server = self.create_test_server(name=server_name,
68 wait_until='ACTIVE')
Sean Dagueab277ad2013-03-15 15:59:06 -040069 id2 = server['id']
Andrea Frittoli0d0a3f32017-08-29 18:21:37 +010070 self.addCleanup(waiters.wait_for_server_termination,
71 self.servers_client, id2)
72 self.addCleanup(
73 test_utils.call_and_ignore_notfound_exc,
74 self.servers_client.delete_server, id2)
Sean Dagueab277ad2013-03-15 15:59:06 -040075 self.assertNotEqual(id1, id2, "Did not create a new server")
ghanshyam0f825252015-08-25 16:02:50 +090076 server = self.client.show_server(id1)['server']
Sean Dagueab277ad2013-03-15 15:59:06 -040077 name1 = server['name']
ghanshyam0f825252015-08-25 16:02:50 +090078 server = self.client.show_server(id2)['server']
Sean Dagueab277ad2013-03-15 15:59:06 -040079 name2 = server['name']
80 self.assertEqual(name1, name2)
Rohit Karajgidc300b22012-05-04 08:11:00 -070081
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -080082 @decorators.idempotent_id('f9e15296-d7f9-4e62-b53f-a04e89160833')
Rohit Karajgidc300b22012-05-04 08:11:00 -070083 def test_create_specify_keypair(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050084 # Specify a keypair while creating a server
Rohit Karajgidc300b22012-05-04 08:11:00 -070085
Masayuki Igawa259c1132013-10-31 17:48:44 +090086 key_name = data_utils.rand_name('key')
Ken'ichi Ohmichie364bce2015-07-17 10:27:59 +000087 self.keypairs_client.create_keypair(name=key_name)
ahmad525a5bc2015-05-12 10:43:02 +053088 self.addCleanup(self.keypairs_client.delete_keypair, key_name)
David Kranz173f0e02015-02-06 13:47:57 -050089 self.keypairs_client.list_keypairs()
David Kranz0fb14292015-02-11 15:55:20 -050090 server = self.create_test_server(key_name=key_name)
Andrea Frittoli0d0a3f32017-08-29 18:21:37 +010091 self.addCleanup(waiters.wait_for_server_termination,
92 self.servers_client, server['id'])
93 self.addCleanup(
94 test_utils.call_and_ignore_notfound_exc,
95 self.servers_client.delete_server, server['id'])
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +000096 waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
ghanshyam0f825252015-08-25 16:02:50 +090097 server = self.client.show_server(server['id'])['server']
Sean Dagueab277ad2013-03-15 15:59:06 -040098 self.assertEqual(key_name, server['key_name'])
Rohit Karajgidc300b22012-05-04 08:11:00 -070099
Alexander Gubanov145258f2015-11-24 15:06:27 +0200100 def _update_server_name(self, server_id, status, prefix_name='server'):
Anh Trand44a8be2016-03-25 09:49:14 +0700101 # The server name should be changed to the provided value
Alexander Gubanov145258f2015-11-24 15:06:27 +0200102 new_name = data_utils.rand_name(prefix_name)
103
Ghanshyam03d4dfd2014-05-26 14:20:37 +0900104 # Update the server with a new name
David Kranz0fb14292015-02-11 15:55:20 -0500105 self.client.update_server(server_id,
106 name=new_name)
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000107 waiters.wait_for_server_status(self.client, server_id, status)
Ghanshyam03d4dfd2014-05-26 14:20:37 +0900108
109 # Verify the name of the server has changed
ghanshyam0f825252015-08-25 16:02:50 +0900110 server = self.client.show_server(server_id)['server']
Ghanshyam03d4dfd2014-05-26 14:20:37 +0900111 self.assertEqual(new_name, server['name'])
112 return server
113
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800114 @decorators.idempotent_id('5e6ccff8-349d-4852-a8b3-055df7988dd2')
Daryl Walleck1465d612011-11-02 02:22:15 -0500115 def test_update_server_name(self):
Anh Trand44a8be2016-03-25 09:49:14 +0700116 # The server name should be changed to the provided value
David Kranz0fb14292015-02-11 15:55:20 -0500117 server = self.create_test_server(wait_until='ACTIVE')
Andrea Frittoli0d0a3f32017-08-29 18:21:37 +0100118 self.addCleanup(waiters.wait_for_server_termination,
119 self.servers_client, server['id'])
120 self.addCleanup(
121 test_utils.call_and_ignore_notfound_exc,
122 self.servers_client.delete_server, server['id'])
Alexander Gubanov145258f2015-11-24 15:06:27 +0200123 # Update instance name with non-ASCII characters
124 prefix_name = u'\u00CD\u00F1st\u00E1\u00F1c\u00E9'
125 self._update_server_name(server['id'], 'ACTIVE', prefix_name)
Daryl Walleck1465d612011-11-02 02:22:15 -0500126
zhufl2ae6b902017-05-08 16:20:41 +0800127 # stop server and check server name update again
Ken'ichi Ohmichib2631082015-08-27 01:31:00 +0000128 self.client.stop_server(server['id'])
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000129 waiters.wait_for_server_status(self.client, server['id'], 'SHUTOFF')
Alexander Gubanov145258f2015-11-24 15:06:27 +0200130 # Update instance name with non-ASCII characters
Alexander Gubanov145258f2015-11-24 15:06:27 +0200131 updated_server = self._update_server_name(server['id'],
132 'SHUTOFF',
133 prefix_name)
Ghanshyam03d4dfd2014-05-26 14:20:37 +0900134 self.assertNotIn('progress', updated_server)
Daryl Walleck1465d612011-11-02 02:22:15 -0500135
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800136 @decorators.idempotent_id('89b90870-bc13-4b73-96af-f9d4f2b70077')
Daryl Walleck1465d612011-11-02 02:22:15 -0500137 def test_update_access_server_address(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500138 # The server's access addresses should reflect the provided values
David Kranz0fb14292015-02-11 15:55:20 -0500139 server = self.create_test_server(wait_until='ACTIVE')
Andrea Frittoli0d0a3f32017-08-29 18:21:37 +0100140 self.addCleanup(waiters.wait_for_server_termination,
141 self.servers_client, server['id'])
142 self.addCleanup(
143 test_utils.call_and_ignore_notfound_exc,
144 self.servers_client.delete_server, server['id'])
Daryl Walleck1465d612011-11-02 02:22:15 -0500145
Sean Dagueab277ad2013-03-15 15:59:06 -0400146 # Update the IPv4 and IPv6 access addresses
David Kranz0fb14292015-02-11 15:55:20 -0500147 self.client.update_server(server['id'],
148 accessIPv4='1.1.1.1',
149 accessIPv6='::babe:202:202')
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000150 waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
Daryl Walleck1465d612011-11-02 02:22:15 -0500151
Sean Dagueab277ad2013-03-15 15:59:06 -0400152 # Verify the access addresses have been updated
ghanshyam0f825252015-08-25 16:02:50 +0900153 server = self.client.show_server(server['id'])['server']
Sean Dagueab277ad2013-03-15 15:59:06 -0400154 self.assertEqual('1.1.1.1', server['accessIPv4'])
155 self.assertEqual('::babe:202:202', server['accessIPv6'])
Rohit Karajgidc300b22012-05-04 08:11:00 -0700156
Ken'ichi Ohmichi14b0ae12017-01-27 17:18:52 -0800157 @decorators.idempotent_id('38fb1d02-c3c5-41de-91d3-9bc2025a75eb')
jun xie0ea79842013-09-26 21:57:44 +0800158 def test_create_server_with_ipv6_addr_only(self):
159 # Create a server without an IPv4 address(only IPv6 address).
David Kranz0fb14292015-02-11 15:55:20 -0500160 server = self.create_test_server(accessIPv6='2001:2001::3')
Andrea Frittoli0d0a3f32017-08-29 18:21:37 +0100161 self.addCleanup(waiters.wait_for_server_termination,
162 self.servers_client, server['id'])
163 self.addCleanup(
164 test_utils.call_and_ignore_notfound_exc,
165 self.servers_client.delete_server, server['id'])
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000166 waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
ghanshyam0f825252015-08-25 16:02:50 +0900167 server = self.client.show_server(server['id'])['server']
jun xie0ea79842013-09-26 21:57:44 +0800168 self.assertEqual('2001:2001::3', server['accessIPv6'])
Sergey Nikitin8654e5b2017-06-04 22:09:56 +0400169
Matt Riedemanna9487f92018-02-08 09:29:59 -0500170 @decorators.related_bug('1730756')
171 @decorators.idempotent_id('defbaca5-d611-49f5-ae21-56ee25d2db49')
172 def test_create_server_specify_multibyte_character_name(self):
173 # prefix character is:
174 # http://unicode.org/cldr/utility/character.jsp?a=20A1
175
176 # We use a string with 3 byte utf-8 character due to nova
177 # will return 400(Bad Request) if we attempt to send a name which has
178 # 4 byte utf-8 character.
179 utf8_name = data_utils.rand_name(b'\xe2\x82\xa1'.decode('utf-8'))
180 self.create_test_server(name=utf8_name, wait_until='ACTIVE')
181
Sergey Nikitin8654e5b2017-06-04 22:09:56 +0400182
183class ServerShowV247Test(base.BaseV2ComputeTest):
184 min_microversion = '2.47'
185 max_microversion = 'latest'
186
ghanshyama8ace722018-04-20 08:45:10 +0000187 # NOTE(gmann): This test tests the server APIs response schema
188 # Along with 2.47 microversion schema this test class tests the
189 # other microversions 2.9, 2.19 and 2.26 server APIs response schema
190 # also. 2.47 APIs schema are on top of 2.9->2.19->2.26 schema so
191 # below tests cover all of the schema.
192
Sergey Nikitin8654e5b2017-06-04 22:09:56 +0400193 @decorators.idempotent_id('88b0bdb2-494c-11e7-a919-92ebcb67fe33')
194 def test_show_server(self):
195 server = self.create_test_server()
196 # All fields will be checked by API schema
197 self.servers_client.show_server(server['id'])
ghanshyama8ace722018-04-20 08:45:10 +0000198
199 @decorators.idempotent_id('8de397c2-57d0-4b90-aa30-e5d668f21a8b')
200 def test_update_rebuild_list_server(self):
201 server = self.create_test_server()
202 # Checking update API response schema
203 self.servers_client.update_server(server['id'])
204 waiters.wait_for_server_status(self.servers_client, server['id'],
205 'ACTIVE')
206 # Checking rebuild API response schema
207 self.servers_client.rebuild_server(server['id'], self.image_ref_alt)
208 waiters.wait_for_server_status(self.servers_client,
209 server['id'], 'ACTIVE')
210 # Checking list details API response schema
211 self.servers_client.list_servers(detail=True)
Jackie Truong1fa44642017-10-25 16:42:08 -0400212
213
214class ServerShowV263Test(base.BaseV2ComputeTest):
215 min_microversion = '2.63'
216 max_microversion = 'latest'
217
218 @decorators.idempotent_id('71b8e3d5-11d2-494f-b917-b094a4afed3c')
219 def test_show_update_rebuild_list_server(self):
220 trusted_certs = ['test-cert-1', 'test-cert-2']
221 server = self.create_test_server(
222 trusted_image_certificates=trusted_certs,
223 wait_until='ACTIVE')
224
225 # Check show API response schema
226 self.servers_client.show_server(server['id'])['server']
227
228 # Check update API response schema
229 self.servers_client.update_server(server['id'])
230 waiters.wait_for_server_status(self.servers_client,
231 server['id'], 'ACTIVE')
232
233 # Check rebuild API response schema
234 self.servers_client.rebuild_server(server['id'], self.image_ref_alt)
235 waiters.wait_for_server_status(self.servers_client,
236 server['id'], 'ACTIVE')
237
238 # Check list details API response schema
239 params = {'trusted_image_certificates': trusted_certs}
240 servers = self.servers_client.list_servers(
241 detail=True, **params)['servers']
242 self.assertNotEmpty(servers)