blob: 993d39eac80157c8d6475609e094c5200c3e1bf1 [file] [log] [blame]
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +08001# Copyright 2013 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
Matthew Treinishc49fcbe2015-02-05 23:37:34 -050015from tempest_lib import decorators
16
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080017from tempest.api.compute import base
Rohan Kanade9ce97df2013-12-10 18:59:35 +053018from tempest.common import fixed_network
Fei Long Wangd39431f2015-05-14 11:30:48 +120019from tempest.common.utils import data_utils
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +000020from tempest.common import waiters
ChenZhengd4acec42014-01-03 15:22:31 +080021from tempest import test
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080022
23
ivan-zhuf2b00502013-10-18 10:06:52 +080024class ServersAdminTestJSON(base.BaseV2ComputeAdminTest):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000025 """Tests Servers API using admin privileges"""
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080026
ChenZhengd4acec42014-01-03 15:22:31 +080027 _host_key = 'OS-EXT-SRV-ATTR:host'
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080028
29 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053030 def setup_clients(cls):
31 super(ServersAdminTestJSON, cls).setup_clients()
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080032 cls.client = cls.os_adm.servers_client
Zhi Kun Liue5401762013-09-11 20:45:48 +080033 cls.non_admin_client = cls.servers_client
Zhu Zhuda070852013-09-25 08:07:57 -050034 cls.flavors_client = cls.os_adm.flavors_client
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080035
Rohan Kanade60b73092015-02-04 17:58:19 +053036 @classmethod
37 def resource_setup(cls):
38 super(ServersAdminTestJSON, cls).resource_setup()
39
Masayuki Igawa259c1132013-10-31 17:48:44 +090040 cls.s1_name = data_utils.rand_name('server')
David Kranz0fb14292015-02-11 15:55:20 -050041 server = cls.create_test_server(name=cls.s1_name,
42 wait_until='ACTIVE')
LingxianKongc26e6072013-09-28 21:16:52 +080043 cls.s1_id = server['id']
44
Masayuki Igawa259c1132013-10-31 17:48:44 +090045 cls.s2_name = data_utils.rand_name('server')
David Kranz0fb14292015-02-11 15:55:20 -050046 server = cls.create_test_server(name=cls.s2_name,
47 wait_until='ACTIVE')
ChenZheng5b62f652014-01-03 15:03:33 +080048 cls.s2_id = server['id']
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080049
Chris Hoge7579c1a2015-02-26 14:12:15 -080050 @test.idempotent_id('51717b38-bdc1-458b-b636-1cf82d99f62f')
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080051 def test_list_servers_by_admin(self):
52 # Listing servers by admin user returns empty list by default
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +000053 body = self.client.list_servers(detail=True)
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080054 servers = body['servers']
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080055 self.assertEqual([], servers)
56
Chris Hoge7579c1a2015-02-26 14:12:15 -080057 @test.idempotent_id('06f960bb-15bb-48dc-873d-f96e89be7870')
ChenZheng5b62f652014-01-03 15:03:33 +080058 def test_list_servers_filter_by_error_status(self):
59 # Filter the list of servers by server error status
60 params = {'status': 'error'}
David Kranzae99b9a2015-02-16 13:37:01 -050061 self.client.reset_state(self.s1_id, state='error')
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +000062 body = self.non_admin_client.list_servers(**params)
ChenZheng5b62f652014-01-03 15:03:33 +080063 # Reset server's state to 'active'
David Kranzae99b9a2015-02-16 13:37:01 -050064 self.client.reset_state(self.s1_id, state='active')
ChenZheng5b62f652014-01-03 15:03:33 +080065 # Verify server's state
ghanshyam0f825252015-08-25 16:02:50 +090066 server = self.client.show_server(self.s1_id)['server']
ChenZheng5b62f652014-01-03 15:03:33 +080067 self.assertEqual(server['status'], 'ACTIVE')
68 servers = body['servers']
69 # Verify error server in list result
70 self.assertIn(self.s1_id, map(lambda x: x['id'], servers))
71 self.assertNotIn(self.s2_id, map(lambda x: x['id'], servers))
72
Chris Hoge7579c1a2015-02-26 14:12:15 -080073 @test.idempotent_id('9f5579ae-19b4-4985-a091-2a5d56106580')
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080074 def test_list_servers_by_admin_with_all_tenants(self):
75 # Listing servers by admin user with all tenants parameter
76 # Here should be listed all servers
77 params = {'all_tenants': ''}
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +000078 body = self.client.list_servers(detail=True, **params)
Liu, Zhi Kunb0ac0b82013-06-20 16:20:21 +080079 servers = body['servers']
80 servers_name = map(lambda x: x['name'], servers)
81
82 self.assertIn(self.s1_name, servers_name)
83 self.assertIn(self.s2_name, servers_name)
84
Chris Hoge7579c1a2015-02-26 14:12:15 -080085 @test.idempotent_id('7e5d6b8f-454a-4ba1-8ae2-da857af8338b')
David Kranzb28b4182015-01-05 16:07:19 -050086 def test_list_servers_by_admin_with_specified_tenant(self):
87 # In nova v2, tenant_id is ignored unless all_tenants is specified
88
89 # List the primary tenant but get nothing due to odd specified behavior
90 tenant_id = self.non_admin_client.tenant_id
91 params = {'tenant_id': tenant_id}
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +000092 body = self.client.list_servers(detail=True, **params)
David Kranzb28b4182015-01-05 16:07:19 -050093 servers = body['servers']
94 self.assertEqual([], servers)
95
96 # List the admin tenant which has no servers
97 admin_tenant_id = self.client.tenant_id
98 params = {'all_tenants': '', 'tenant_id': admin_tenant_id}
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +000099 body = self.client.list_servers(detail=True, **params)
David Kranzb28b4182015-01-05 16:07:19 -0500100 servers = body['servers']
101 self.assertEqual([], servers)
102
Chris Hoge7579c1a2015-02-26 14:12:15 -0800103 @test.idempotent_id('86c7a8f7-50cf-43a9-9bac-5b985317134f')
ChenZhengd4acec42014-01-03 15:22:31 +0800104 def test_list_servers_filter_by_exist_host(self):
105 # Filter the list of servers by existent host
106 name = data_utils.rand_name('server')
107 flavor = self.flavor_ref
108 image_id = self.image_ref
Rohan Kanade9ce97df2013-12-10 18:59:35 +0530109 network = self.get_tenant_network()
110 network_kwargs = fixed_network.set_networks_kwarg(network)
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +0000111 test_server = self.client.create_server(name=name, imageRef=image_id,
112 flavorRef=flavor,
ghanshyam0f825252015-08-25 16:02:50 +0900113 **network_kwargs)['server']
ChenZhengd4acec42014-01-03 15:22:31 +0800114 self.addCleanup(self.client.delete_server, test_server['id'])
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000115 waiters.wait_for_server_status(self.client,
116 test_server['id'], 'ACTIVE')
ghanshyam0f825252015-08-25 16:02:50 +0900117 server = self.client.show_server(test_server['id'])['server']
ChenZhengd4acec42014-01-03 15:22:31 +0800118 self.assertEqual(server['status'], 'ACTIVE')
119 hostname = server[self._host_key]
120 params = {'host': hostname}
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +0000121 body = self.client.list_servers(**params)
ChenZhengd4acec42014-01-03 15:22:31 +0800122 servers = body['servers']
123 nonexistent_params = {'host': 'nonexistent_host'}
Ken'ichi Ohmichicbc26a82015-07-03 08:18:04 +0000124 nonexistent_body = self.client.list_servers(**nonexistent_params)
ChenZhengd4acec42014-01-03 15:22:31 +0800125 nonexistent_servers = nonexistent_body['servers']
126 self.assertIn(test_server['id'], map(lambda x: x['id'], servers))
127 self.assertNotIn(test_server['id'],
128 map(lambda x: x['id'], nonexistent_servers))
129
Chris Hoge7579c1a2015-02-26 14:12:15 -0800130 @test.idempotent_id('ee8ae470-db70-474d-b752-690b7892cab1')
LingxianKongc26e6072013-09-28 21:16:52 +0800131 def test_reset_state_server(self):
132 # Reset server's state to 'error'
David Kranzae99b9a2015-02-16 13:37:01 -0500133 self.client.reset_state(self.s1_id)
LingxianKongc26e6072013-09-28 21:16:52 +0800134
135 # Verify server's state
ghanshyam0f825252015-08-25 16:02:50 +0900136 server = self.client.show_server(self.s1_id)['server']
LingxianKongc26e6072013-09-28 21:16:52 +0800137 self.assertEqual(server['status'], 'ERROR')
138
139 # Reset server's state to 'active'
David Kranzae99b9a2015-02-16 13:37:01 -0500140 self.client.reset_state(self.s1_id, state='active')
LingxianKongc26e6072013-09-28 21:16:52 +0800141
142 # Verify server's state
ghanshyam0f825252015-08-25 16:02:50 +0900143 server = self.client.show_server(self.s1_id)['server']
LingxianKongc26e6072013-09-28 21:16:52 +0800144 self.assertEqual(server['status'], 'ACTIVE')
145
Matthew Treinishc49fcbe2015-02-05 23:37:34 -0500146 @decorators.skip_because(bug="1240043")
Chris Hoge7579c1a2015-02-26 14:12:15 -0800147 @test.idempotent_id('31ff3486-b8a0-4f56-a6c0-aab460531db3')
Zhu Zhuda070852013-09-25 08:07:57 -0500148 def test_get_server_diagnostics_by_admin(self):
149 # Retrieve server diagnostics by admin user
David Kranzae99b9a2015-02-16 13:37:01 -0500150 diagnostic = self.client.get_server_diagnostics(self.s1_id)
Zhu Zhuda070852013-09-25 08:07:57 -0500151 basic_attrs = ['rx_packets', 'rx_errors', 'rx_drop',
152 'tx_packets', 'tx_errors', 'tx_drop',
153 'read_req', 'write_req', 'cpu', 'memory']
154 for key in basic_attrs:
155 self.assertIn(key, str(diagnostic.keys()))
156
Chris Hoge7579c1a2015-02-26 14:12:15 -0800157 @test.idempotent_id('682cb127-e5bb-4f53-87ce-cb9003604442')
Zhi Kun Liue5401762013-09-11 20:45:48 +0800158 def test_rebuild_server_in_error_state(self):
159 # The server in error state should be rebuilt using the provided
160 # image and changed to ACTIVE state
161
Marc Solanasb15d8b62014-02-07 00:04:15 -0800162 # resetting vm state require admin privilege
David Kranzae99b9a2015-02-16 13:37:01 -0500163 self.client.reset_state(self.s1_id, state='error')
Ken'ichi Ohmichi5271b0f2015-08-10 07:53:27 +0000164 rebuilt_server = self.non_admin_client.rebuild_server(
ghanshyam0f825252015-08-25 16:02:50 +0900165 self.s1_id, self.image_ref_alt)['server']
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000166 self.addCleanup(waiters.wait_for_server_status, self.non_admin_client,
Zhi Kun Liue5401762013-09-11 20:45:48 +0800167 self.s1_id, 'ACTIVE')
Ken'ichi Ohmichi5271b0f2015-08-10 07:53:27 +0000168 self.addCleanup(self.non_admin_client.rebuild_server, self.s1_id,
Zhi Kun Liue5401762013-09-11 20:45:48 +0800169 self.image_ref)
170
171 # Verify the properties in the initial response are correct
172 self.assertEqual(self.s1_id, rebuilt_server['id'])
173 rebuilt_image_id = rebuilt_server['image']['id']
174 self.assertEqual(self.image_ref_alt, rebuilt_image_id)
175 self.assertEqual(self.flavor_ref, rebuilt_server['flavor']['id'])
Ken'ichi Ohmichi0eb153c2015-07-13 02:18:25 +0000176 waiters.wait_for_server_status(self.non_admin_client,
177 rebuilt_server['id'], 'ACTIVE',
178 raise_on_error=False)
Zhi Kun Liue5401762013-09-11 20:45:48 +0800179 # Verify the server properties after rebuilding
ghanshyam0f825252015-08-25 16:02:50 +0900180 server = (self.non_admin_client.show_server(rebuilt_server['id'])
181 ['server'])
Zhi Kun Liue5401762013-09-11 20:45:48 +0800182 rebuilt_image_id = server['image']['id']
183 self.assertEqual(self.image_ref_alt, rebuilt_image_id)
184
Chris Hoge7579c1a2015-02-26 14:12:15 -0800185 @test.idempotent_id('7a1323b4-a6a2-497a-96cb-76c07b945c71')
Ghanshyam Mann79f4a092014-02-27 21:01:31 +0900186 def test_reset_network_inject_network_info(self):
187 # Reset Network of a Server
David Kranz0fb14292015-02-11 15:55:20 -0500188 server = self.create_test_server(wait_until='ACTIVE')
David Kranzae99b9a2015-02-16 13:37:01 -0500189 self.client.reset_network(server['id'])
Ghanshyam Mann79f4a092014-02-27 21:01:31 +0900190 # Inject the Network Info into Server
David Kranzae99b9a2015-02-16 13:37:01 -0500191 self.client.inject_network_info(server['id'])
Ghanshyam Mann79f4a092014-02-27 21:01:31 +0900192
Chris Hoge7579c1a2015-02-26 14:12:15 -0800193 @test.idempotent_id('fdcd9b33-0903-4e00-a1f7-b5f6543068d6')
raiesmh08cbe21b02014-03-12 17:04:44 +0530194 def test_create_server_with_scheduling_hint(self):
195 # Create a server with scheduler hints.
196 hints = {
197 'same_host': self.s1_id
198 }
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +0000199 self.create_test_server(scheduler_hints=hints,
David Kranz0fb14292015-02-11 15:55:20 -0500200 wait_until='ACTIVE')