blob: 08d8a0dc77ee7c7e31187a4d11308c784dd24c90 [file] [log] [blame]
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +09001# 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
Sean Dague1937d092013-05-17 16:36:38 -040016from tempest.api.compute import base
Matthew Treinisha03ed792013-09-23 21:38:15 +000017from tempest.common import tempest_fixtures as fixtures
Masayuki Igawa259c1132013-10-31 17:48:44 +090018from tempest.common.utils import data_utils
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090019from tempest.test import attr
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090020
21
ivan-zhuf2b00502013-10-18 10:06:52 +080022class AggregatesAdminTestJSON(base.BaseV2ComputeAdminTest):
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090023
24 """
25 Tests Aggregates API that require admin privileges
26 """
27
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +090028 _host_key = 'OS-EXT-SRV-ATTR:host'
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090029 _interface = 'json'
30
31 @classmethod
32 def setUpClass(cls):
33 super(AggregatesAdminTestJSON, cls).setUpClass()
34 cls.client = cls.os_adm.aggregates_client
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090035 cls.aggregate_name_prefix = 'test_aggregate_'
36 cls.az_name_prefix = 'test_az_'
37
38 resp, hosts_all = cls.os_adm.hosts_client.list_hosts()
39 hosts = map(lambda x: x['host_name'],
40 filter(lambda y: y['service'] == 'compute', hosts_all))
41 cls.host = hosts[0]
42
Giulio Fidenteba3985a2013-05-29 01:46:36 +020043 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090044 def test_aggregate_create_delete(self):
45 # Create and delete an aggregate.
Masayuki Igawa259c1132013-10-31 17:48:44 +090046 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000047 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
Chang Bo Guofc77e932013-09-16 17:38:26 -070048 self.assertEqual(200, resp.status)
49 self.assertEqual(aggregate_name, aggregate['name'])
50 self.assertEqual(None, aggregate['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090051
52 resp, _ = self.client.delete_aggregate(aggregate['id'])
Chang Bo Guofc77e932013-09-16 17:38:26 -070053 self.assertEqual(200, resp.status)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090054 self.client.wait_for_resource_deletion(aggregate['id'])
55
Giulio Fidenteba3985a2013-05-29 01:46:36 +020056 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090057 def test_aggregate_create_delete_with_az(self):
58 # Create and delete an aggregate.
Masayuki Igawa259c1132013-10-31 17:48:44 +090059 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
60 az_name = data_utils.rand_name(self.az_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000061 resp, aggregate = self.client.create_aggregate(
62 name=aggregate_name, availability_zone=az_name)
Chang Bo Guofc77e932013-09-16 17:38:26 -070063 self.assertEqual(200, resp.status)
64 self.assertEqual(aggregate_name, aggregate['name'])
65 self.assertEqual(az_name, aggregate['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090066
67 resp, _ = self.client.delete_aggregate(aggregate['id'])
Chang Bo Guofc77e932013-09-16 17:38:26 -070068 self.assertEqual(200, resp.status)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090069 self.client.wait_for_resource_deletion(aggregate['id'])
70
Giulio Fidenteba3985a2013-05-29 01:46:36 +020071 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090072 def test_aggregate_create_verify_entry_in_list(self):
73 # Create an aggregate and ensure it is listed.
Masayuki Igawa259c1132013-10-31 17:48:44 +090074 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000075 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090076 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
77
78 resp, aggregates = self.client.list_aggregates()
Chang Bo Guofc77e932013-09-16 17:38:26 -070079 self.assertEqual(200, resp.status)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090080 self.assertIn((aggregate['id'], aggregate['availability_zone']),
81 map(lambda x: (x['id'], x['availability_zone']),
82 aggregates))
83
Giulio Fidenteba3985a2013-05-29 01:46:36 +020084 @attr(type='gate')
ivan-zhu35e1f8e2013-10-18 15:51:16 +080085 def test_aggregate_create_update_metadata_get_details(self):
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090086 # Create an aggregate and ensure its details are returned.
Masayuki Igawa259c1132013-10-31 17:48:44 +090087 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Yuiko Takadaf93d2482014-01-30 16:25:08 +000088 resp, aggregate = self.client.create_aggregate(name=aggregate_name)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090089 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
90
91 resp, body = self.client.get_aggregate(aggregate['id'])
Chang Bo Guofc77e932013-09-16 17:38:26 -070092 self.assertEqual(200, resp.status)
93 self.assertEqual(aggregate['name'], body['name'])
94 self.assertEqual(aggregate['availability_zone'],
95 body['availability_zone'])
ivan-zhu35e1f8e2013-10-18 15:51:16 +080096 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"])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900108
Zhu Zhu7b5f6292013-09-22 15:47:54 +0800109 @attr(type='gate')
110 def test_aggregate_create_update_with_az(self):
111 # Update an aggregate and ensure properties are updated correctly
Masayuki Igawa259c1132013-10-31 17:48:44 +0900112 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)
Zhu Zhu7b5f6292013-09-22 15:47:54 +0800116 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
117
118 self.assertEqual(200, resp.status)
119 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
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200141 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900142 def test_aggregate_add_remove_host(self):
143 # Add an host to the given aggregate and remove.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000144 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900145 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)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900147 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
148
149 resp, body = self.client.add_host(aggregate['id'], self.host)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700150 self.assertEqual(200, resp.status)
151 self.assertEqual(aggregate_name, body['name'])
152 self.assertEqual(aggregate['availability_zone'],
153 body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900154 self.assertIn(self.host, body['hosts'])
155
156 resp, body = self.client.remove_host(aggregate['id'], self.host)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700157 self.assertEqual(200, resp.status)
158 self.assertEqual(aggregate_name, body['name'])
159 self.assertEqual(aggregate['availability_zone'],
160 body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900161 self.assertNotIn(self.host, body['hosts'])
162
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200163 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900164 def test_aggregate_add_host_list(self):
165 # Add an host to the given aggregate and list.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000166 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900167 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)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900169 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)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700175 self.assertEqual(1, len(aggs))
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900176 agg = aggs[0]
Chang Bo Guofc77e932013-09-16 17:38:26 -0700177 self.assertEqual(aggregate_name, agg['name'])
178 self.assertEqual(None, agg['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900179 self.assertIn(self.host, agg['hosts'])
180
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200181 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900182 def test_aggregate_add_host_get_details(self):
183 # Add an host to the given aggregate and get details.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000184 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900185 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)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900187 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'])
Chang Bo Guofc77e932013-09-16 17:38:26 -0700192 self.assertEqual(aggregate_name, body['name'])
193 self.assertEqual(None, body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900194 self.assertIn(self.host, body['hosts'])
195
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200196 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900197 def test_aggregate_add_host_create_server_with_az(self):
198 # Add an host to the given aggregate and create a server.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000199 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900200 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)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900204 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)
Masayuki Igawa259c1132013-10-31 17:48:44 +0900207 server_name = data_utils.rand_name('test_server_')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900208 admin_servers_client = self.os_adm.servers_client
Ken'ichi Ohmichicfc052e2013-10-23 11:50:04 +0900209 resp, server = self.create_test_server(name=server_name,
210 availability_zone=az_name,
211 wait_until='ACTIVE')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900212 resp, body = admin_servers_client.get_server(server['id'])
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +0900213 self.assertEqual(self.host, body[self._host_key])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900214
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +0900215
216class AggregatesAdminTestXML(AggregatesAdminTestJSON):
217 _host_key = (
218 '{http://docs.openstack.org/compute/ext/extended_status/api/v1.1}host')
219 _interface = 'xml'