blob: 956eddd7b7eb9ae7ecb36737c4477199d84caa82 [file] [log] [blame]
ivan-zhu8577cb12013-08-20 14:38:36 +08001# Copyright 2013 NEC Corporation.
2# 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
16from tempest.api.compute import base
17from tempest.common import tempest_fixtures as fixtures
18from tempest.common.utils import data_utils
ivan-zhu00fe64f2013-08-20 19:35:51 +080019from tempest import test
ivan-zhu8577cb12013-08-20 14:38:36 +080020
21
ivan-zhu00fe64f2013-08-20 19:35:51 +080022class AggregatesAdminV3TestJSON(base.BaseV3ComputeAdminTest):
ivan-zhu8577cb12013-08-20 14:38:36 +080023
24 """
25 Tests Aggregates API that require admin privileges
26 """
27
ivan-zhu00fe64f2013-08-20 19:35:51 +080028 _host_key = 'os-extended-server-attributes:host'
ivan-zhu8577cb12013-08-20 14:38:36 +080029 _interface = 'json'
30
31 @classmethod
32 def setUpClass(cls):
ivan-zhu00fe64f2013-08-20 19:35:51 +080033 super(AggregatesAdminV3TestJSON, cls).setUpClass()
34 cls.client = cls.aggregates_admin_client
35 cls.user_client = cls.aggregates_client
ivan-zhu8577cb12013-08-20 14:38:36 +080036 cls.aggregate_name_prefix = 'test_aggregate_'
37 cls.az_name_prefix = 'test_az_'
38
ivan-zhu00fe64f2013-08-20 19:35:51 +080039 resp, hosts_all = cls.hosts_admin_client.list_hosts()
ivan-zhu8577cb12013-08-20 14:38:36 +080040 hosts = map(lambda x: x['host_name'],
41 filter(lambda y: y['service'] == 'compute', hosts_all))
42 cls.host = hosts[0]
43
ivan-zhu00fe64f2013-08-20 19:35:51 +080044 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080045 def test_aggregate_create_delete(self):
46 # Create and delete an aggregate.
47 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
48 resp, aggregate = self.client.create_aggregate(aggregate_name)
ivan-zhu00fe64f2013-08-20 19:35:51 +080049 self.assertEqual(201, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080050 self.assertEqual(aggregate_name, aggregate['name'])
51 self.assertEqual(None, aggregate['availability_zone'])
52
53 resp, _ = self.client.delete_aggregate(aggregate['id'])
ivan-zhu00fe64f2013-08-20 19:35:51 +080054 self.assertEqual(204, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080055 self.client.wait_for_resource_deletion(aggregate['id'])
56
ivan-zhu00fe64f2013-08-20 19:35:51 +080057 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080058 def test_aggregate_create_delete_with_az(self):
59 # Create and delete an aggregate.
60 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
61 az_name = data_utils.rand_name(self.az_name_prefix)
62 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
ivan-zhu00fe64f2013-08-20 19:35:51 +080063 self.assertEqual(201, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080064 self.assertEqual(aggregate_name, aggregate['name'])
65 self.assertEqual(az_name, aggregate['availability_zone'])
66
67 resp, _ = self.client.delete_aggregate(aggregate['id'])
ivan-zhu00fe64f2013-08-20 19:35:51 +080068 self.assertEqual(204, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080069 self.client.wait_for_resource_deletion(aggregate['id'])
70
ivan-zhu00fe64f2013-08-20 19:35:51 +080071 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080072 def test_aggregate_create_verify_entry_in_list(self):
73 # Create an aggregate and ensure it is listed.
74 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
75 resp, aggregate = self.client.create_aggregate(aggregate_name)
76 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
77
78 resp, aggregates = self.client.list_aggregates()
79 self.assertEqual(200, resp.status)
80 self.assertIn((aggregate['id'], aggregate['availability_zone']),
81 map(lambda x: (x['id'], x['availability_zone']),
82 aggregates))
83
ivan-zhu00fe64f2013-08-20 19:35:51 +080084 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080085 def test_aggregate_create_update_metadata_get_details(self):
86 # Create an aggregate and ensure its details are returned.
87 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
88 resp, aggregate = self.client.create_aggregate(aggregate_name)
89 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
90
91 resp, body = self.client.get_aggregate(aggregate['id'])
92 self.assertEqual(200, resp.status)
93 self.assertEqual(aggregate['name'], body['name'])
94 self.assertEqual(aggregate['availability_zone'],
95 body['availability_zone'])
96 self.assertEqual({}, body["metadata"])
97
98 # set the metadata of the aggregate
99 meta = {"key": "value"}
100 resp, body = self.client.set_metadata(aggregate['id'], meta)
101 self.assertEqual(200, resp.status)
102 self.assertEqual(meta, body["metadata"])
103
104 # verify the metadata has been set
105 resp, body = self.client.get_aggregate(aggregate['id'])
106 self.assertEqual(200, resp.status)
107 self.assertEqual(meta, body["metadata"])
108
ivan-zhu00fe64f2013-08-20 19:35:51 +0800109 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800110 def test_aggregate_create_update_with_az(self):
111 # Update an aggregate and ensure properties are updated correctly
112 self.useFixture(fixtures.LockFixture('availability_zone'))
113 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
114 az_name = data_utils.rand_name(self.az_name_prefix)
115 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
116 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
117
ivan-zhu00fe64f2013-08-20 19:35:51 +0800118 self.assertEqual(201, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +0800119 self.assertEqual(aggregate_name, aggregate['name'])
120 self.assertEqual(az_name, aggregate['availability_zone'])
121 self.assertIsNotNone(aggregate['id'])
122
123 aggregate_id = aggregate['id']
124 new_aggregate_name = aggregate_name + '_new'
125 new_az_name = az_name + '_new'
126
127 resp, resp_aggregate = self.client.update_aggregate(aggregate_id,
128 new_aggregate_name,
129 new_az_name)
130 self.assertEqual(200, resp.status)
131 self.assertEqual(new_aggregate_name, resp_aggregate['name'])
132 self.assertEqual(new_az_name, resp_aggregate['availability_zone'])
133
134 resp, aggregates = self.client.list_aggregates()
135 self.assertEqual(200, resp.status)
136 self.assertIn((aggregate_id, new_aggregate_name, new_az_name),
137 map(lambda x:
138 (x['id'], x['name'], x['availability_zone']),
139 aggregates))
140
ivan-zhu00fe64f2013-08-20 19:35:51 +0800141 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800142 def test_aggregate_add_remove_host(self):
143 # Add an host to the given aggregate and remove.
144 self.useFixture(fixtures.LockFixture('availability_zone'))
145 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
146 resp, aggregate = self.client.create_aggregate(aggregate_name)
147 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
148
149 resp, body = self.client.add_host(aggregate['id'], self.host)
ivan-zhu00fe64f2013-08-20 19:35:51 +0800150 self.assertEqual(202, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +0800151 self.assertEqual(aggregate_name, body['name'])
152 self.assertEqual(aggregate['availability_zone'],
153 body['availability_zone'])
154 self.assertIn(self.host, body['hosts'])
155
156 resp, body = self.client.remove_host(aggregate['id'], self.host)
ivan-zhu00fe64f2013-08-20 19:35:51 +0800157 self.assertEqual(202, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +0800158 self.assertEqual(aggregate_name, body['name'])
159 self.assertEqual(aggregate['availability_zone'],
160 body['availability_zone'])
161 self.assertNotIn(self.host, body['hosts'])
162
ivan-zhu00fe64f2013-08-20 19:35:51 +0800163 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800164 def test_aggregate_add_host_list(self):
165 # Add an host to the given aggregate and list.
166 self.useFixture(fixtures.LockFixture('availability_zone'))
167 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
168 resp, aggregate = self.client.create_aggregate(aggregate_name)
169 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
170 self.client.add_host(aggregate['id'], self.host)
171 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
172
173 resp, aggregates = self.client.list_aggregates()
174 aggs = filter(lambda x: x['id'] == aggregate['id'], aggregates)
175 self.assertEqual(1, len(aggs))
176 agg = aggs[0]
177 self.assertEqual(aggregate_name, agg['name'])
178 self.assertEqual(None, agg['availability_zone'])
179 self.assertIn(self.host, agg['hosts'])
180
ivan-zhu00fe64f2013-08-20 19:35:51 +0800181 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800182 def test_aggregate_add_host_get_details(self):
183 # Add an host to the given aggregate and get details.
184 self.useFixture(fixtures.LockFixture('availability_zone'))
185 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
186 resp, aggregate = self.client.create_aggregate(aggregate_name)
187 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
188 self.client.add_host(aggregate['id'], self.host)
189 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
190
191 resp, body = self.client.get_aggregate(aggregate['id'])
192 self.assertEqual(aggregate_name, body['name'])
193 self.assertEqual(None, body['availability_zone'])
194 self.assertIn(self.host, body['hosts'])
195
ivan-zhu00fe64f2013-08-20 19:35:51 +0800196 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800197 def test_aggregate_add_host_create_server_with_az(self):
198 # Add an host to the given aggregate and create a server.
199 self.useFixture(fixtures.LockFixture('availability_zone'))
200 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
201 az_name = data_utils.rand_name(self.az_name_prefix)
202 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
203 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
204 self.client.add_host(aggregate['id'], self.host)
205 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
206 server_name = data_utils.rand_name('test_server_')
ivan-zhu00fe64f2013-08-20 19:35:51 +0800207 admin_servers_client = self.servers_admin_client
ivan-zhu8577cb12013-08-20 14:38:36 +0800208 resp, server = self.create_test_server(name=server_name,
209 availability_zone=az_name,
210 wait_until='ACTIVE')
211 resp, body = admin_servers_client.get_server(server['id'])
212 self.assertEqual(self.host, body[self._host_key])