blob: 98d25509e695d629375f25428d0ea5aa19e5613e [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)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090047 resp, aggregate = self.client.create_aggregate(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)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090061 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
Chang Bo Guofc77e932013-09-16 17:38:26 -070062 self.assertEqual(200, resp.status)
63 self.assertEqual(aggregate_name, aggregate['name'])
64 self.assertEqual(az_name, aggregate['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090065
66 resp, _ = self.client.delete_aggregate(aggregate['id'])
Chang Bo Guofc77e932013-09-16 17:38:26 -070067 self.assertEqual(200, resp.status)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090068 self.client.wait_for_resource_deletion(aggregate['id'])
69
Giulio Fidenteba3985a2013-05-29 01:46:36 +020070 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090071 def test_aggregate_create_verify_entry_in_list(self):
72 # Create an aggregate and ensure it is listed.
Masayuki Igawa259c1132013-10-31 17:48:44 +090073 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090074 resp, aggregate = self.client.create_aggregate(aggregate_name)
75 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
76
77 resp, aggregates = self.client.list_aggregates()
Chang Bo Guofc77e932013-09-16 17:38:26 -070078 self.assertEqual(200, resp.status)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090079 self.assertIn((aggregate['id'], aggregate['availability_zone']),
80 map(lambda x: (x['id'], x['availability_zone']),
81 aggregates))
82
Giulio Fidenteba3985a2013-05-29 01:46:36 +020083 @attr(type='gate')
ivan-zhu35e1f8e2013-10-18 15:51:16 +080084 def test_aggregate_create_update_metadata_get_details(self):
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090085 # Create an aggregate and ensure its details are returned.
Masayuki Igawa259c1132013-10-31 17:48:44 +090086 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +090087 resp, aggregate = self.client.create_aggregate(aggregate_name)
88 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
89
90 resp, body = self.client.get_aggregate(aggregate['id'])
Chang Bo Guofc77e932013-09-16 17:38:26 -070091 self.assertEqual(200, resp.status)
92 self.assertEqual(aggregate['name'], body['name'])
93 self.assertEqual(aggregate['availability_zone'],
94 body['availability_zone'])
ivan-zhu35e1f8e2013-10-18 15:51:16 +080095 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"])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900107
Zhu Zhu7b5f6292013-09-22 15:47:54 +0800108 @attr(type='gate')
109 def test_aggregate_create_update_with_az(self):
110 # Update an aggregate and ensure properties are updated correctly
Masayuki Igawa259c1132013-10-31 17:48:44 +0900111 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
112 az_name = data_utils.rand_name(self.az_name_prefix)
Zhu Zhu7b5f6292013-09-22 15:47:54 +0800113 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
114 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
115
116 self.assertEqual(200, resp.status)
117 self.assertEqual(aggregate_name, aggregate['name'])
118 self.assertEqual(az_name, aggregate['availability_zone'])
119 self.assertIsNotNone(aggregate['id'])
120
121 aggregate_id = aggregate['id']
122 new_aggregate_name = aggregate_name + '_new'
123 new_az_name = az_name + '_new'
124
125 resp, resp_aggregate = self.client.update_aggregate(aggregate_id,
126 new_aggregate_name,
127 new_az_name)
128 self.assertEqual(200, resp.status)
129 self.assertEqual(new_aggregate_name, resp_aggregate['name'])
130 self.assertEqual(new_az_name, resp_aggregate['availability_zone'])
131
132 resp, aggregates = self.client.list_aggregates()
133 self.assertEqual(200, resp.status)
134 self.assertIn((aggregate_id, new_aggregate_name, new_az_name),
135 map(lambda x:
136 (x['id'], x['name'], x['availability_zone']),
137 aggregates))
138
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200139 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900140 def test_aggregate_add_remove_host(self):
141 # Add an host to the given aggregate and remove.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000142 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900143 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900144 resp, aggregate = self.client.create_aggregate(aggregate_name)
145 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
146
147 resp, body = self.client.add_host(aggregate['id'], self.host)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700148 self.assertEqual(200, resp.status)
149 self.assertEqual(aggregate_name, body['name'])
150 self.assertEqual(aggregate['availability_zone'],
151 body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900152 self.assertIn(self.host, body['hosts'])
153
154 resp, body = self.client.remove_host(aggregate['id'], self.host)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700155 self.assertEqual(200, resp.status)
156 self.assertEqual(aggregate_name, body['name'])
157 self.assertEqual(aggregate['availability_zone'],
158 body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900159 self.assertNotIn(self.host, body['hosts'])
160
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200161 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900162 def test_aggregate_add_host_list(self):
163 # Add an host to the given aggregate and list.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000164 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900165 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900166 resp, aggregate = self.client.create_aggregate(aggregate_name)
167 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
168 self.client.add_host(aggregate['id'], self.host)
169 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
170
171 resp, aggregates = self.client.list_aggregates()
172 aggs = filter(lambda x: x['id'] == aggregate['id'], aggregates)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700173 self.assertEqual(1, len(aggs))
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900174 agg = aggs[0]
Chang Bo Guofc77e932013-09-16 17:38:26 -0700175 self.assertEqual(aggregate_name, agg['name'])
176 self.assertEqual(None, agg['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900177 self.assertIn(self.host, agg['hosts'])
178
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200179 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900180 def test_aggregate_add_host_get_details(self):
181 # Add an host to the given aggregate and get details.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000182 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900183 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900184 resp, aggregate = self.client.create_aggregate(aggregate_name)
185 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
186 self.client.add_host(aggregate['id'], self.host)
187 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
188
189 resp, body = self.client.get_aggregate(aggregate['id'])
Chang Bo Guofc77e932013-09-16 17:38:26 -0700190 self.assertEqual(aggregate_name, body['name'])
191 self.assertEqual(None, body['availability_zone'])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900192 self.assertIn(self.host, body['hosts'])
193
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200194 @attr(type='gate')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900195 def test_aggregate_add_host_create_server_with_az(self):
196 # Add an host to the given aggregate and create a server.
Matthew Treinisha03ed792013-09-23 21:38:15 +0000197 self.useFixture(fixtures.LockFixture('availability_zone'))
Masayuki Igawa259c1132013-10-31 17:48:44 +0900198 aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
199 az_name = data_utils.rand_name(self.az_name_prefix)
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900200 resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
201 self.addCleanup(self.client.delete_aggregate, aggregate['id'])
202 self.client.add_host(aggregate['id'], self.host)
203 self.addCleanup(self.client.remove_host, aggregate['id'], self.host)
Masayuki Igawa259c1132013-10-31 17:48:44 +0900204 server_name = data_utils.rand_name('test_server_')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900205 admin_servers_client = self.os_adm.servers_client
Ken'ichi Ohmichicfc052e2013-10-23 11:50:04 +0900206 resp, server = self.create_test_server(name=server_name,
207 availability_zone=az_name,
208 wait_until='ACTIVE')
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900209 resp, body = admin_servers_client.get_server(server['id'])
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +0900210 self.assertEqual(self.host, body[self._host_key])
Mitsuhiko Yamazaki74f07072013-04-02 11:52:31 +0900211
Mitsuhiko Yamazakiae8fc532013-04-22 11:17:35 +0900212
213class AggregatesAdminTestXML(AggregatesAdminTestJSON):
214 _host_key = (
215 '{http://docs.openstack.org/compute/ext/extended_status/api/v1.1}host')
216 _interface = 'xml'