blob: 886b6a760900c8da9e0206c5d7e574ba6edeae9a [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
Ken'ichi Ohmichi7f508ed2014-01-30 22:35:20 +090022class AggregatesAdminV3Test(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
30 @classmethod
31 def setUpClass(cls):
Ken'ichi Ohmichi7f508ed2014-01-30 22:35:20 +090032 super(AggregatesAdminV3Test, cls).setUpClass()
ivan-zhu00fe64f2013-08-20 19:35:51 +080033 cls.client = cls.aggregates_admin_client
ivan-zhu8577cb12013-08-20 14:38:36 +080034 cls.aggregate_name_prefix = 'test_aggregate_'
35 cls.az_name_prefix = 'test_az_'
36
ivan-zhu00fe64f2013-08-20 19:35:51 +080037 resp, hosts_all = cls.hosts_admin_client.list_hosts()
ivan-zhu8577cb12013-08-20 14:38:36 +080038 hosts = map(lambda x: x['host_name'],
39 filter(lambda y: y['service'] == 'compute', hosts_all))
40 cls.host = hosts[0]
41
ivan-zhu00fe64f2013-08-20 19:35:51 +080042 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080043 def test_aggregate_create_delete(self):
44 # Create and delete an aggregate.
45 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000046 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu00fe64f2013-08-20 19:35:51 +080047 self.assertEqual(201, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080048 self.assertEqual(aggregate_name, aggregate['name'])
llg8212e4cd3922014-02-15 12:14:21 +080049 self.assertIsNone(aggregate['availability_zone'])
ivan-zhu8577cb12013-08-20 14:38:36 +080050
51 resp, _ = self.client.delete_aggregate(aggregate['id'])
ivan-zhu00fe64f2013-08-20 19:35:51 +080052 self.assertEqual(204, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080053 self.client.wait_for_resource_deletion(aggregate['id'])
54
ivan-zhu00fe64f2013-08-20 19:35:51 +080055 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080056 def test_aggregate_create_delete_with_az(self):
57 # Create and delete an aggregate.
58 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
59 az_name = data_utils.rand_name(self.az_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000060 resp, aggregate = self.client.create_aggregate(
61 name=aggregate_name, availability_zone=az_name)
ivan-zhu00fe64f2013-08-20 19:35:51 +080062 self.assertEqual(201, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080063 self.assertEqual(aggregate_name, aggregate['name'])
64 self.assertEqual(az_name, aggregate['availability_zone'])
65
66 resp, _ = self.client.delete_aggregate(aggregate['id'])
ivan-zhu00fe64f2013-08-20 19:35:51 +080067 self.assertEqual(204, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080068 self.client.wait_for_resource_deletion(aggregate['id'])
69
ivan-zhu00fe64f2013-08-20 19:35:51 +080070 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080071 def test_aggregate_create_verify_entry_in_list(self):
72 # Create an aggregate and ensure it is listed.
73 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000074 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +080075 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
76
77 resp, aggregates = self.client.list_aggregates()
78 self.assertEqual(200, resp.status)
79 self.assertIn((aggregate['id'], aggregate['availability_zone']),
80 map(lambda x: (x['id'], x['availability_zone']),
81 aggregates))
82
ivan-zhu00fe64f2013-08-20 19:35:51 +080083 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080084 def test_aggregate_create_update_metadata_get_details(self):
85 # Create an aggregate and ensure its details are returned.
86 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000087 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +080088 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
89
90 resp, body = self.client.get_aggregate(aggregate['id'])
91 self.assertEqual(200, resp.status)
92 self.assertEqual(aggregate['name'], body['name'])
93 self.assertEqual(aggregate['availability_zone'],
94 body['availability_zone'])
95 self.assertEqual({}, body["metadata"])
96
97 # set the metadata of the aggregate
98 meta = {"key": "value"}
99 resp, body = self.client.set_metadata(aggregate['id'], meta)
100 self.assertEqual(200, resp.status)
101 self.assertEqual(meta, body["metadata"])
102
103 # verify the metadata has been set
104 resp, body = self.client.get_aggregate(aggregate['id'])
105 self.assertEqual(200, resp.status)
106 self.assertEqual(meta, body["metadata"])
107
ivan-zhu00fe64f2013-08-20 19:35:51 +0800108 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800109 def test_aggregate_create_update_with_az(self):
110 # Update an aggregate and ensure properties are updated correctly
111 self.useFixture(fixtures.LockFixture('availability_zone'))
112 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
113 az_name = data_utils.rand_name(self.az_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000114 resp, aggregate = self.client.create_aggregate(
115 name=aggregate_name, availability_zone=az_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800116 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:
Matthew Treinish1d14c542014-06-17 20:25:40 -0400138 (x['id'], x['name'], x['availability_zone']),
ivan-zhu8577cb12013-08-20 14:38:36 +0800139 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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000146 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800147 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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000168 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800169 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'])
llg8212e4cd3922014-02-15 12:14:21 +0800178 self.assertIsNone(agg['availability_zone'])
ivan-zhu8577cb12013-08-20 14:38:36 +0800179 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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000186 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800187 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'])
llg8212e4cd3922014-02-15 12:14:21 +0800193 self.assertIsNone(body['availability_zone'])
ivan-zhu8577cb12013-08-20 14:38:36 +0800194 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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000202 resp, aggregate = self.client.create_aggregate(
203 name=aggregate_name, availability_zone=az_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800204 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_')
ivan-zhu00fe64f2013-08-20 19:35:51 +0800208 admin_servers_client = self.servers_admin_client
ivan-zhu8577cb12013-08-20 14:38:36 +0800209 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])