blob: acdfb7498572da62bb6e21e6d2ebb38b4323b307 [file] [log] [blame]
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +09001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2013 NEC Corporation.
4# All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.compute import base
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090019from tempest.common.utils.data_utils import rand_name
20from tempest import exceptions
21from tempest.test import attr
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090022
23
24class AggregatesAdminTestJSON(base.BaseComputeAdminTest):
25
26 """
27 Tests Aggregates API that require admin privileges
28 """
29
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +090030 _host_key = 'OS-EXT-SRV-ATTR:host'
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090031 _interface = 'json'
32
33 @classmethod
34 def setUpClass(cls):
35 super(AggregatesAdminTestJSON, cls).setUpClass()
36 cls.client = cls.os_adm.aggregates_client
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +090037 cls.user_client = cls.aggregates_client
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090038 cls.aggregate_name_prefix = 'test_aggregate_'
39 cls.az_name_prefix = 'test_az_'
40
41 resp, hosts_all = cls.os_adm.hosts_client.list_hosts()
42 hosts = map(lambda x: x['host_name'],
43 filter(lambda y: y['service'] == 'compute', hosts_all))
44 cls.host = hosts[0]
45
Giampaolo Lauriae9c77022013-05-22 01:23:58 -040046 @attr(type=['positive', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090047 def test_aggregate_create_delete(self):
48 # Create and delete an aggregate.
49 aggregate_name = rand_name(self.aggregate_name_prefix)
50 resp, aggregate = self.client.create_aggregate(aggregate_name)
51 self.assertEquals(200, resp.status)
52 self.assertEquals(aggregate_name, aggregate['name'])
53 self.assertEquals(None, aggregate['availability_zone'])
54
55 resp, _ = self.client.delete_aggregate(aggregate['id'])
56 self.assertEquals(200, resp.status)
57 self.client.wait_for_resource_deletion(aggregate['id'])
58
Giampaolo Lauriae9c77022013-05-22 01:23:58 -040059 @attr(type=['positive', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090060 def test_aggregate_create_delete_with_az(self):
61 # Create and delete an aggregate.
62 aggregate_name = rand_name(self.aggregate_name_prefix)
63 az_name = rand_name(self.az_name_prefix)
64 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
65 self.assertEquals(200, resp.status)
66 self.assertEquals(aggregate_name, aggregate['name'])
67 self.assertEquals(az_name, aggregate['availability_zone'])
68
69 resp, _ = self.client.delete_aggregate(aggregate['id'])
70 self.assertEquals(200, resp.status)
71 self.client.wait_for_resource_deletion(aggregate['id'])
72
Giampaolo Lauriae9c77022013-05-22 01:23:58 -040073 @attr(type=['positive', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090074 def test_aggregate_create_verify_entry_in_list(self):
75 # Create an aggregate and ensure it is listed.
76 aggregate_name = rand_name(self.aggregate_name_prefix)
77 resp, aggregate = self.client.create_aggregate(aggregate_name)
78 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
79
80 resp, aggregates = self.client.list_aggregates()
81 self.assertEquals(200, resp.status)
82 self.assertIn((aggregate['id'], aggregate['availability_zone']),
83 map(lambda x: (x['id'], x['availability_zone']),
84 aggregates))
85
Giampaolo Lauriae9c77022013-05-22 01:23:58 -040086 @attr(type=['positive', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090087 def test_aggregate_create_get_details(self):
88 # Create an aggregate and ensure its details are returned.
89 aggregate_name = rand_name(self.aggregate_name_prefix)
90 resp, aggregate = self.client.create_aggregate(aggregate_name)
91 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
92
93 resp, body = self.client.get_aggregate(aggregate['id'])
94 self.assertEquals(200, resp.status)
95 self.assertEquals(aggregate['name'], body['name'])
96 self.assertEquals(aggregate['availability_zone'],
97 body['availability_zone'])
98
Giampaolo Lauriae9c77022013-05-22 01:23:58 -040099 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900100 def test_aggregate_create_as_user(self):
101 # Regular user is not allowed to create an aggregate.
102 aggregate_name = rand_name(self.aggregate_name_prefix)
103 self.assertRaises(exceptions.Unauthorized,
104 self.user_client.create_aggregate,
105 aggregate_name)
106
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400107 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900108 def test_aggregate_delete_as_user(self):
109 # Regular user is not allowed to delete an aggregate.
110 aggregate_name = rand_name(self.aggregate_name_prefix)
111 resp, aggregate = self.client.create_aggregate(aggregate_name)
112 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
113
114 self.assertRaises(exceptions.Unauthorized,
115 self.user_client.delete_aggregate,
116 aggregate['id'])
117
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400118 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900119 def test_aggregate_list_as_user(self):
120 # Regular user is not allowed to list aggregates.
121 self.assertRaises(exceptions.Unauthorized,
122 self.user_client.list_aggregates)
123
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400124 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900125 def test_aggregate_get_details_as_user(self):
126 # Regular user is not allowed to get aggregate details.
127 aggregate_name = rand_name(self.aggregate_name_prefix)
128 resp, aggregate = self.client.create_aggregate(aggregate_name)
129 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
130
131 self.assertRaises(exceptions.Unauthorized,
132 self.user_client.get_aggregate,
133 aggregate['id'])
134
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400135 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900136 def test_aggregate_delete_with_invalid_id(self):
137 # Delete an aggregate with invalid id should raise exceptions.
138 self.assertRaises(exceptions.NotFound,
139 self.client.delete_aggregate, -1)
140
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400141 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900142 def test_aggregate_get_details_with_invalid_id(self):
143 # Get aggregate details with invalid id should raise exceptions.
144 self.assertRaises(exceptions.NotFound,
145 self.client.get_aggregate, -1)
146
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400147 @attr(type=['positive', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900148 def test_aggregate_add_remove_host(self):
149 # Add an host to the given aggregate and remove.
150 aggregate_name = rand_name(self.aggregate_name_prefix)
151 resp, aggregate = self.client.create_aggregate(aggregate_name)
152 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
153
154 resp, body = self.client.add_host(aggregate['id'], self.host)
155 self.assertEquals(200, resp.status)
156 self.assertEquals(aggregate_name, body['name'])
157 self.assertEquals(aggregate['availability_zone'],
158 body['availability_zone'])
159 self.assertIn(self.host, body['hosts'])
160
161 resp, body = self.client.remove_host(aggregate['id'], self.host)
162 self.assertEquals(200, resp.status)
163 self.assertEquals(aggregate_name, body['name'])
164 self.assertEquals(aggregate['availability_zone'],
165 body['availability_zone'])
166 self.assertNotIn(self.host, body['hosts'])
167
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400168 @attr(type=['positive', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900169 def test_aggregate_add_host_list(self):
170 # Add an host to the given aggregate and list.
171 aggregate_name = rand_name(self.aggregate_name_prefix)
172 resp, aggregate = self.client.create_aggregate(aggregate_name)
173 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
174 self.client.add_host(aggregate['id'], self.host)
175 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
176
177 resp, aggregates = self.client.list_aggregates()
178 aggs = filter(lambda x: x['id'] == aggregate['id'], aggregates)
179 self.assertEquals(1, len(aggs))
180 agg = aggs[0]
181 self.assertEquals(aggregate_name, agg['name'])
182 self.assertEquals(None, agg['availability_zone'])
183 self.assertIn(self.host, agg['hosts'])
184
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400185 @attr(type=['positive', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900186 def test_aggregate_add_host_get_details(self):
187 # Add an host to the given aggregate and get details.
188 aggregate_name = rand_name(self.aggregate_name_prefix)
189 resp, aggregate = self.client.create_aggregate(aggregate_name)
190 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
191 self.client.add_host(aggregate['id'], self.host)
192 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
193
194 resp, body = self.client.get_aggregate(aggregate['id'])
195 self.assertEquals(aggregate_name, body['name'])
196 self.assertEquals(None, body['availability_zone'])
197 self.assertIn(self.host, body['hosts'])
198
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400199 @attr(type=['positive', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900200 def test_aggregate_add_host_create_server_with_az(self):
201 # Add an host to the given aggregate and create a server.
202 aggregate_name = rand_name(self.aggregate_name_prefix)
203 az_name = rand_name(self.az_name_prefix)
204 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
205 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
206 self.client.add_host(aggregate['id'], self.host)
207 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
208
209 server_name = rand_name('test_server_')
210 servers_client = self.servers_client
211 admin_servers_client = self.os_adm.servers_client
212 resp, server = self.create_server(name=server_name,
213 availability_zone=az_name)
214 servers_client.wait_for_server_status(server['id'], 'ACTIVE')
215 resp, body = admin_servers_client.get_server(server['id'])
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +0900216 self.assertEqual(self.host, body[self._host_key])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900217
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400218 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900219 def test_aggregate_add_non_exist_host(self):
220 # Adding a non-exist host to an aggregate should raise exceptions.
221 resp, hosts_all = self.os_adm.hosts_client.list_hosts()
222 hosts = map(lambda x: x['host_name'], hosts_all)
223 while True:
224 non_exist_host = rand_name('nonexist_host_')
225 if non_exist_host not in hosts:
226 break
227
228 aggregate_name = rand_name(self.aggregate_name_prefix)
229 resp, aggregate = self.client.create_aggregate(aggregate_name)
230 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
231
232 self.assertRaises(exceptions.NotFound, self.client.add_host,
233 aggregate['id'], non_exist_host)
234
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400235 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900236 def test_aggregate_add_host_as_user(self):
237 # Regular user is not allowed to add a host to an aggregate.
238 aggregate_name = rand_name(self.aggregate_name_prefix)
239 resp, aggregate = self.client.create_aggregate(aggregate_name)
240 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
241
242 self.assertRaises(exceptions.Unauthorized,
243 self.user_client.add_host,
244 aggregate['id'], self.host)
245
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400246 @attr(type=['negative', 'gate'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900247 def test_aggregate_remove_host_as_user(self):
248 # Regular user is not allowed to remove a host from an aggregate.
249 aggregate_name = rand_name(self.aggregate_name_prefix)
250 resp, aggregate = self.client.create_aggregate(aggregate_name)
251 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
252 self.client.add_host(aggregate['id'], self.host)
253 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
254
255 self.assertRaises(exceptions.Unauthorized,
256 self.user_client.remove_host,
257 aggregate['id'], self.host)
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +0900258
259
260class AggregatesAdminTestXML(AggregatesAdminTestJSON):
261 _host_key = (
262 '{http://docs.openstack.org/compute/ext/extended_status/api/v1.1}host')
263 _interface = 'xml'