blob: b8b478d5cb931e913d8f5197868316a6eac657ad [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 _interface = 'json'
30
31 @classmethod
32 def setUpClass(cls):
Ken'ichi Ohmichi7f508ed2014-01-30 22:35:20 +090033 super(AggregatesAdminV3Test, cls).setUpClass()
ivan-zhu00fe64f2013-08-20 19:35:51 +080034 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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000048 resp, aggregate = self.client.create_aggregate(name=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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000062 resp, aggregate = self.client.create_aggregate(
63 name=aggregate_name, availability_zone=az_name)
ivan-zhu00fe64f2013-08-20 19:35:51 +080064 self.assertEqual(201, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080065 self.assertEqual(aggregate_name, aggregate['name'])
66 self.assertEqual(az_name, aggregate['availability_zone'])
67
68 resp, _ = self.client.delete_aggregate(aggregate['id'])
ivan-zhu00fe64f2013-08-20 19:35:51 +080069 self.assertEqual(204, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +080070 self.client.wait_for_resource_deletion(aggregate['id'])
71
ivan-zhu00fe64f2013-08-20 19:35:51 +080072 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080073 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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000076 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +080077 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
ivan-zhu00fe64f2013-08-20 19:35:51 +080085 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +080086 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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000089 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +080090 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
ivan-zhu00fe64f2013-08-20 19:35:51 +0800110 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800111 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)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000116 resp, aggregate = self.client.create_aggregate(
117 name=aggregate_name, availability_zone=az_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800118 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
119
ivan-zhu00fe64f2013-08-20 19:35:51 +0800120 self.assertEqual(201, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +0800121 self.assertEqual(aggregate_name, aggregate['name'])
122 self.assertEqual(az_name, aggregate['availability_zone'])
123 self.assertIsNotNone(aggregate['id'])
124
125 aggregate_id = aggregate['id']
126 new_aggregate_name = aggregate_name + '_new'
127 new_az_name = az_name + '_new'
128
129 resp, resp_aggregate = self.client.update_aggregate(aggregate_id,
130 new_aggregate_name,
131 new_az_name)
132 self.assertEqual(200, resp.status)
133 self.assertEqual(new_aggregate_name, resp_aggregate['name'])
134 self.assertEqual(new_az_name, resp_aggregate['availability_zone'])
135
136 resp, aggregates = self.client.list_aggregates()
137 self.assertEqual(200, resp.status)
138 self.assertIn((aggregate_id, new_aggregate_name, new_az_name),
139 map(lambda x:
140 (x['id'], x['name'], x['availability_zone']),
141 aggregates))
142
ivan-zhu00fe64f2013-08-20 19:35:51 +0800143 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800144 def test_aggregate_add_remove_host(self):
145 # Add an host to the given aggregate and remove.
146 self.useFixture(fixtures.LockFixture('availability_zone'))
147 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000148 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800149 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
150
151 resp, body = self.client.add_host(aggregate['id'], self.host)
ivan-zhu00fe64f2013-08-20 19:35:51 +0800152 self.assertEqual(202, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +0800153 self.assertEqual(aggregate_name, body['name'])
154 self.assertEqual(aggregate['availability_zone'],
155 body['availability_zone'])
156 self.assertIn(self.host, body['hosts'])
157
158 resp, body = self.client.remove_host(aggregate['id'], self.host)
ivan-zhu00fe64f2013-08-20 19:35:51 +0800159 self.assertEqual(202, resp.status)
ivan-zhu8577cb12013-08-20 14:38:36 +0800160 self.assertEqual(aggregate_name, body['name'])
161 self.assertEqual(aggregate['availability_zone'],
162 body['availability_zone'])
163 self.assertNotIn(self.host, body['hosts'])
164
ivan-zhu00fe64f2013-08-20 19:35:51 +0800165 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800166 def test_aggregate_add_host_list(self):
167 # Add an host to the given aggregate and list.
168 self.useFixture(fixtures.LockFixture('availability_zone'))
169 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000170 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800171 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
172 self.client.add_host(aggregate['id'], self.host)
173 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
174
175 resp, aggregates = self.client.list_aggregates()
176 aggs = filter(lambda x: x['id'] == aggregate['id'], aggregates)
177 self.assertEqual(1, len(aggs))
178 agg = aggs[0]
179 self.assertEqual(aggregate_name, agg['name'])
180 self.assertEqual(None, agg['availability_zone'])
181 self.assertIn(self.host, agg['hosts'])
182
ivan-zhu00fe64f2013-08-20 19:35:51 +0800183 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800184 def test_aggregate_add_host_get_details(self):
185 # Add an host to the given aggregate and get details.
186 self.useFixture(fixtures.LockFixture('availability_zone'))
187 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000188 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800189 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
190 self.client.add_host(aggregate['id'], self.host)
191 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
192
193 resp, body = self.client.get_aggregate(aggregate['id'])
194 self.assertEqual(aggregate_name, body['name'])
195 self.assertEqual(None, body['availability_zone'])
196 self.assertIn(self.host, body['hosts'])
197
ivan-zhu00fe64f2013-08-20 19:35:51 +0800198 @test.attr(type='gate')
ivan-zhu8577cb12013-08-20 14:38:36 +0800199 def test_aggregate_add_host_create_server_with_az(self):
200 # Add an host to the given aggregate and create a server.
201 self.useFixture(fixtures.LockFixture('availability_zone'))
202 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
203 az_name = data_utils.rand_name(self.az_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000204 resp, aggregate = self.client.create_aggregate(
205 name=aggregate_name, availability_zone=az_name)
ivan-zhu8577cb12013-08-20 14:38:36 +0800206 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
207 self.client.add_host(aggregate['id'], self.host)
208 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
209 server_name = data_utils.rand_name('test_server_')
ivan-zhu00fe64f2013-08-20 19:35:51 +0800210 admin_servers_client = self.servers_admin_client
ivan-zhu8577cb12013-08-20 14:38:36 +0800211 resp, server = self.create_test_server(name=server_name,
212 availability_zone=az_name,
213 wait_until='ACTIVE')
214 resp, body = admin_servers_client.get_server(server['id'])
215 self.assertEqual(self.host, body[self._host_key])