blob: 609d2c69c398f6e8c482a4f5a4eadabb6d5254aa [file] [log] [blame]
ivan-zhu8577cb12013-08-20 14:38:36 +08001# 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
18from tempest.api.compute import base
19from tempest.common import tempest_fixtures as fixtures
20from tempest.common.utils import data_utils
21from tempest.test import attr
22
23
24class AggregatesAdminTestJSON(base.BaseV2ComputeAdminTest):
25
26 """
27 Tests Aggregates API that require admin privileges
28 """
29
30 _host_key = 'OS-EXT-SRV-ATTR:host'
31 _interface = 'json'
32
33 @classmethod
34 def setUpClass(cls):
35 super(AggregatesAdminTestJSON, cls).setUpClass()
36 cls.client = cls.os_adm.aggregates_client
37 cls.aggregate_name_prefix = 'test_aggregate_'
38 cls.az_name_prefix = 'test_az_'
39
40 resp, hosts_all = cls.os_adm.hosts_client.list_hosts()
41 hosts = map(lambda x: x['host_name'],
42 filter(lambda y: y['service'] == 'compute', hosts_all))
43 cls.host = hosts[0]
44
45 @attr(type='gate')
46 def test_aggregate_create_delete(self):
47 # Create and delete an aggregate.
48 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
49 resp, aggregate = self.client.create_aggregate(aggregate_name)
50 self.assertEqual(200, resp.status)
51 self.assertEqual(aggregate_name, aggregate['name'])
52 self.assertEqual(None, aggregate['availability_zone'])
53
54 resp, _ = self.client.delete_aggregate(aggregate['id'])
55 self.assertEqual(200, resp.status)
56 self.client.wait_for_resource_deletion(aggregate['id'])
57
58 @attr(type='gate')
59 def test_aggregate_create_delete_with_az(self):
60 # Create and delete an aggregate.
61 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
62 az_name = data_utils.rand_name(self.az_name_prefix)
63 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
64 self.assertEqual(200, resp.status)
65 self.assertEqual(aggregate_name, aggregate['name'])
66 self.assertEqual(az_name, aggregate['availability_zone'])
67
68 resp, _ = self.client.delete_aggregate(aggregate['id'])
69 self.assertEqual(200, resp.status)
70 self.client.wait_for_resource_deletion(aggregate['id'])
71
72 @attr(type='gate')
73 def test_aggregate_create_verify_entry_in_list(self):
74 # Create an aggregate and ensure it is listed.
75 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
76 resp, aggregate = self.client.create_aggregate(aggregate_name)
77 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
78
79 resp, aggregates = self.client.list_aggregates()
80 self.assertEqual(200, resp.status)
81 self.assertIn((aggregate['id'], aggregate['availability_zone']),
82 map(lambda x: (x['id'], x['availability_zone']),
83 aggregates))
84
85 @attr(type='gate')
86 def test_aggregate_create_update_metadata_get_details(self):
87 # Create an aggregate and ensure its details are returned.
88 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
89 resp, aggregate = self.client.create_aggregate(aggregate_name)
90 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
91
92 resp, body = self.client.get_aggregate(aggregate['id'])
93 self.assertEqual(200, resp.status)
94 self.assertEqual(aggregate['name'], body['name'])
95 self.assertEqual(aggregate['availability_zone'],
96 body['availability_zone'])
97 self.assertEqual({}, body["metadata"])
98
99 # set the metadata of the aggregate
100 meta = {"key": "value"}
101 resp, body = self.client.set_metadata(aggregate['id'], meta)
102 self.assertEqual(200, resp.status)
103 self.assertEqual(meta, body["metadata"])
104
105 # verify the metadata has been set
106 resp, body = self.client.get_aggregate(aggregate['id'])
107 self.assertEqual(200, resp.status)
108 self.assertEqual(meta, body["metadata"])
109
110 @attr(type='gate')
111 def test_aggregate_create_update_with_az(self):
112 # Update an aggregate and ensure properties are updated correctly
113 self.useFixture(fixtures.LockFixture('availability_zone'))
114 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
115 az_name = data_utils.rand_name(self.az_name_prefix)
116 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
117 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
118
119 self.assertEqual(200, resp.status)
120 self.assertEqual(aggregate_name, aggregate['name'])
121 self.assertEqual(az_name, aggregate['availability_zone'])
122 self.assertIsNotNone(aggregate['id'])
123
124 aggregate_id = aggregate['id']
125 new_aggregate_name = aggregate_name + '_new'
126 new_az_name = az_name + '_new'
127
128 resp, resp_aggregate = self.client.update_aggregate(aggregate_id,
129 new_aggregate_name,
130 new_az_name)
131 self.assertEqual(200, resp.status)
132 self.assertEqual(new_aggregate_name, resp_aggregate['name'])
133 self.assertEqual(new_az_name, resp_aggregate['availability_zone'])
134
135 resp, aggregates = self.client.list_aggregates()
136 self.assertEqual(200, resp.status)
137 self.assertIn((aggregate_id, new_aggregate_name, new_az_name),
138 map(lambda x:
139 (x['id'], x['name'], x['availability_zone']),
140 aggregates))
141
142 @attr(type='gate')
143 def test_aggregate_add_remove_host(self):
144 # Add an host to the given aggregate and remove.
145 self.useFixture(fixtures.LockFixture('availability_zone'))
146 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
147 resp, aggregate = self.client.create_aggregate(aggregate_name)
148 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
149
150 resp, body = self.client.add_host(aggregate['id'], self.host)
151 self.assertEqual(200, resp.status)
152 self.assertEqual(aggregate_name, body['name'])
153 self.assertEqual(aggregate['availability_zone'],
154 body['availability_zone'])
155 self.assertIn(self.host, body['hosts'])
156
157 resp, body = self.client.remove_host(aggregate['id'], self.host)
158 self.assertEqual(200, resp.status)
159 self.assertEqual(aggregate_name, body['name'])
160 self.assertEqual(aggregate['availability_zone'],
161 body['availability_zone'])
162 self.assertNotIn(self.host, body['hosts'])
163
164 @attr(type='gate')
165 def test_aggregate_add_host_list(self):
166 # Add an host to the given aggregate and list.
167 self.useFixture(fixtures.LockFixture('availability_zone'))
168 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
169 resp, aggregate = self.client.create_aggregate(aggregate_name)
170 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
171 self.client.add_host(aggregate['id'], self.host)
172 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
173
174 resp, aggregates = self.client.list_aggregates()
175 aggs = filter(lambda x: x['id'] == aggregate['id'], aggregates)
176 self.assertEqual(1, len(aggs))
177 agg = aggs[0]
178 self.assertEqual(aggregate_name, agg['name'])
179 self.assertEqual(None, agg['availability_zone'])
180 self.assertIn(self.host, agg['hosts'])
181
182 @attr(type='gate')
183 def test_aggregate_add_host_get_details(self):
184 # Add an host to the given aggregate and get details.
185 self.useFixture(fixtures.LockFixture('availability_zone'))
186 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
187 resp, aggregate = self.client.create_aggregate(aggregate_name)
188 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
189 self.client.add_host(aggregate['id'], self.host)
190 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
191
192 resp, body = self.client.get_aggregate(aggregate['id'])
193 self.assertEqual(aggregate_name, body['name'])
194 self.assertEqual(None, body['availability_zone'])
195 self.assertIn(self.host, body['hosts'])
196
197 @attr(type='gate')
198 def test_aggregate_add_host_create_server_with_az(self):
199 # Add an host to the given aggregate and create a server.
200 self.useFixture(fixtures.LockFixture('availability_zone'))
201 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
202 az_name = data_utils.rand_name(self.az_name_prefix)
203 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
204 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
205 self.client.add_host(aggregate['id'], self.host)
206 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
207 server_name = data_utils.rand_name('test_server_')
208 admin_servers_client = self.os_adm.servers_client
209 resp, server = self.create_test_server(name=server_name,
210 availability_zone=az_name,
211 wait_until='ACTIVE')
212 resp, body = admin_servers_client.get_server(server['id'])
213 self.assertEqual(self.host, body[self._host_key])
214
215
216class AggregatesAdminTestXML(AggregatesAdminTestJSON):
217 _host_key = (
218 '{http://docs.openstack.org/compute/ext/extended_status/api/v1.1}host')
219 _interface = 'xml'