blob: 609d2c69c398f6e8c482a4f5a4eadabb6d5254aa [file] [log] [blame]
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +09001# 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
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.compute import base
Matthew Treinisha03ed792013-09-23 21:38:15 +000019from tempest.common import tempest_fixtures as fixtures
Masayuki Igawa259c1132013-10-31 17:48:44 +090020from tempest.common.utils import data_utils
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090021from tempest.test import attr
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090022
23
ivan-zhuf2b00502013-10-18 10:06:52 +080024class AggregatesAdminTestJSON(base.BaseV2ComputeAdminTest):
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090025
26 """
27 Tests Aggregates API that require admin privileges
28 """
29
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +090030 _host_key = 'OS-EXT-SRV-ATTR:host'
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090031 _interface = 'json'
32
33 @classmethod
34 def setUpClass(cls):
35 super(AggregatesAdminTestJSON, cls).setUpClass()
36 cls.client = cls.os_adm.aggregates_client
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090037 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
Giulio Fidenteba3985a2013-05-29 01:46:36 +020045 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090046 def test_aggregate_create_delete(self):
47 # Create and delete an aggregate.
Masayuki Igawa259c1132013-10-31 17:48:44 +090048 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090049 resp, aggregate = self.client.create_aggregate(aggregate_name)
Chang Bo Guofc77e932013-09-16 17:38:26 -070050 self.assertEqual(200, resp.status)
51 self.assertEqual(aggregate_name, aggregate['name'])
52 self.assertEqual(None, aggregate['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090053
54 resp, _ = self.client.delete_aggregate(aggregate['id'])
Chang Bo Guofc77e932013-09-16 17:38:26 -070055 self.assertEqual(200, resp.status)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090056 self.client.wait_for_resource_deletion(aggregate['id'])
57
Giulio Fidenteba3985a2013-05-29 01:46:36 +020058 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090059 def test_aggregate_create_delete_with_az(self):
60 # Create and delete an aggregate.
Masayuki Igawa259c1132013-10-31 17:48:44 +090061 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
62 az_name = data_utils.rand_name(self.az_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090063 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
Chang Bo Guofc77e932013-09-16 17:38:26 -070064 self.assertEqual(200, resp.status)
65 self.assertEqual(aggregate_name, aggregate['name'])
66 self.assertEqual(az_name, aggregate['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090067
68 resp, _ = self.client.delete_aggregate(aggregate['id'])
Chang Bo Guofc77e932013-09-16 17:38:26 -070069 self.assertEqual(200, resp.status)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090070 self.client.wait_for_resource_deletion(aggregate['id'])
71
Giulio Fidenteba3985a2013-05-29 01:46:36 +020072 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090073 def test_aggregate_create_verify_entry_in_list(self):
74 # Create an aggregate and ensure it is listed.
Masayuki Igawa259c1132013-10-31 17:48:44 +090075 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090076 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()
Chang Bo Guofc77e932013-09-16 17:38:26 -070080 self.assertEqual(200, resp.status)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090081 self.assertIn((aggregate['id'], aggregate['availability_zone']),
82 map(lambda x: (x['id'], x['availability_zone']),
83 aggregates))
84
Giulio Fidenteba3985a2013-05-29 01:46:36 +020085 @attr(type='gate')
ivan-zhu35e1f8e2013-10-18 15:51:16 +080086 def test_aggregate_create_update_metadata_get_details(self):
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090087 # Create an aggregate and ensure its details are returned.
Masayuki Igawa259c1132013-10-31 17:48:44 +090088 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090089 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'])
Chang Bo Guofc77e932013-09-16 17:38:26 -070093 self.assertEqual(200, resp.status)
94 self.assertEqual(aggregate['name'], body['name'])
95 self.assertEqual(aggregate['availability_zone'],
96 body['availability_zone'])
ivan-zhu35e1f8e2013-10-18 15:51:16 +080097 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"])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900109
Zhu Zhu7b5f6292013-09-22 15:47:54 +0800110 @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'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900114 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
115 az_name = data_utils.rand_name(self.az_name_prefix)
Zhu Zhu7b5f6292013-09-22 15:47:54 +0800116 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
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200142 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900143 def test_aggregate_add_remove_host(self):
144 # Add an host to the given aggregate and remove.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000145 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900146 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900147 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)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700151 self.assertEqual(200, resp.status)
152 self.assertEqual(aggregate_name, body['name'])
153 self.assertEqual(aggregate['availability_zone'],
154 body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900155 self.assertIn(self.host, body['hosts'])
156
157 resp, body = self.client.remove_host(aggregate['id'], self.host)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700158 self.assertEqual(200, resp.status)
159 self.assertEqual(aggregate_name, body['name'])
160 self.assertEqual(aggregate['availability_zone'],
161 body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900162 self.assertNotIn(self.host, body['hosts'])
163
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200164 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900165 def test_aggregate_add_host_list(self):
166 # Add an host to the given aggregate and list.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000167 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900168 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900169 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)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700176 self.assertEqual(1, len(aggs))
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900177 agg = aggs[0]
Chang Bo Guofc77e932013-09-16 17:38:26 -0700178 self.assertEqual(aggregate_name, agg['name'])
179 self.assertEqual(None, agg['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900180 self.assertIn(self.host, agg['hosts'])
181
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200182 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900183 def test_aggregate_add_host_get_details(self):
184 # Add an host to the given aggregate and get details.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000185 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900186 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900187 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'])
Chang Bo Guofc77e932013-09-16 17:38:26 -0700193 self.assertEqual(aggregate_name, body['name'])
194 self.assertEqual(None, body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900195 self.assertIn(self.host, body['hosts'])
196
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200197 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900198 def test_aggregate_add_host_create_server_with_az(self):
199 # Add an host to the given aggregate and create a server.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000200 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900201 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
202 az_name = data_utils.rand_name(self.az_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900203 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)
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'