blob: 8e34c16849b28b114f9dfda0013c151e4f990875 [file] [log] [blame]
Mauro S. M. Rodrigues92ed9b82013-12-17 07:21:48 -05001# Copyright 2013 IBM Corp.
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.common import tempest_fixtures as fixtures
Masayuki Igawa4ded9f02014-02-17 15:05:59 +090017from tempest.common.utils import data_utils
Mauro S. M. Rodrigues92ed9b82013-12-17 07:21:48 -050018from tempest.openstack.common import log as logging
19from tempest.scenario import manager
20from tempest import test
21
22
23LOG = logging.getLogger(__name__)
24
25
26class TestAggregatesBasicOps(manager.OfficialClientTest):
27 """
28 Creates an aggregate within an availability zone
29 Adds a host to the aggregate
30 Checks aggregate details
31 Updates aggregate's name
32 Removes host from aggregate
33 Deletes aggregate
34 """
35 @classmethod
36 def credentials(cls):
37 return cls.admin_credentials()
38
Yuiko Takadaf93d2482014-01-30 16:25:08 +000039 def _create_aggregate(self, **kwargs):
40 aggregate = self.compute_client.aggregates.create(**kwargs)
41 aggregate_name = kwargs['name']
42 availability_zone = kwargs['availability_zone']
Mauro S. M. Rodrigues92ed9b82013-12-17 07:21:48 -050043 self.assertEqual(aggregate.name, aggregate_name)
44 self.assertEqual(aggregate.availability_zone, availability_zone)
45 self.set_resource(aggregate.id, aggregate)
46 LOG.debug("Aggregate %s created." % (aggregate.name))
47 return aggregate
48
49 def _delete_aggregate(self, aggregate):
50 self.compute_client.aggregates.delete(aggregate.id)
51 self.remove_resource(aggregate.id)
52 LOG.debug("Aggregate %s deleted. " % (aggregate.name))
53
54 def _get_host_name(self):
55 hosts = self.compute_client.hosts.list()
56 self.assertTrue(len(hosts) >= 1)
57 hostname = hosts[0].host_name
58 return hostname
59
60 def _add_host(self, aggregate_name, host):
61 aggregate = self.compute_client.aggregates.add_host(aggregate_name,
62 host)
63 self.assertIn(host, aggregate.hosts)
64 LOG.debug("Host %s added to Aggregate %s." % (host, aggregate.name))
65
66 def _remove_host(self, aggregate_name, host):
67 aggregate = self.compute_client.aggregates.remove_host(aggregate_name,
68 host)
69 self.assertNotIn(host, aggregate.hosts)
70 LOG.debug("Host %s removed to Aggregate %s." % (host, aggregate.name))
71
72 def _check_aggregate_details(self, aggregate, aggregate_name, azone,
73 hosts, metadata):
74 aggregate = self.compute_client.aggregates.get(aggregate.id)
75 self.assertEqual(aggregate_name, aggregate.name)
76 self.assertEqual(azone, aggregate.availability_zone)
77 self.assertEqual(aggregate.hosts, hosts)
78 for meta_key in metadata.keys():
79 self.assertIn(meta_key, aggregate.metadata)
80 self.assertEqual(metadata[meta_key], aggregate.metadata[meta_key])
81 LOG.debug("Aggregate %s details match." % aggregate.name)
82
83 def _set_aggregate_metadata(self, aggregate, meta):
84 aggregate = self.compute_client.aggregates.set_metadata(aggregate.id,
85 meta)
86
87 for key, value in meta.items():
88 self.assertEqual(meta[key], aggregate.metadata[key])
89 LOG.debug("Aggregate %s metadata updated successfully." %
90 aggregate.name)
91
92 def _update_aggregate(self, aggregate, aggregate_name,
93 availability_zone):
94 values = {}
95 if aggregate_name:
96 values.update({'name': aggregate_name})
97 if availability_zone:
98 values.update({'availability_zone': availability_zone})
99 if values.keys():
100 aggregate = self.compute_client.aggregates.update(aggregate.id,
101 values)
102 for key, values in values.items():
103 self.assertEqual(getattr(aggregate, key), values)
104 return aggregate
105
106 @test.services('compute')
107 def test_aggregate_basic_ops(self):
108 self.useFixture(fixtures.LockFixture('availability_zone'))
109 az = 'foo_zone'
Masayuki Igawa4ded9f02014-02-17 15:05:59 +0900110 aggregate_name = data_utils.rand_name('aggregate-scenario')
Yuiko Takadaf93d2482014-01-30 16:25:08 +0000111 aggregate = self._create_aggregate(name=aggregate_name,
112 availability_zone=az)
Mauro S. M. Rodrigues92ed9b82013-12-17 07:21:48 -0500113
114 metadata = {'meta_key': 'meta_value'}
115 self._set_aggregate_metadata(aggregate, metadata)
116
117 host = self._get_host_name()
118 self._add_host(aggregate, host)
119 self._check_aggregate_details(aggregate, aggregate_name, az, [host],
120 metadata)
121
Masayuki Igawa4ded9f02014-02-17 15:05:59 +0900122 aggregate_name = data_utils.rand_name('renamed-aggregate-scenario')
Mauro S. M. Rodrigues92ed9b82013-12-17 07:21:48 -0500123 aggregate = self._update_aggregate(aggregate, aggregate_name, None)
124
125 additional_metadata = {'foo': 'bar'}
126 self._set_aggregate_metadata(aggregate, additional_metadata)
127
128 metadata.update(additional_metadata)
129 self._check_aggregate_details(aggregate, aggregate.name, az, [host],
130 metadata)
131
132 self._remove_host(aggregate, host)
133 self._delete_aggregate(aggregate)