
This fixes a regression introduced with commit 88c7ea8 which replaced list_hosts with list_hypervisors because the former is deprecated. However, the hypervisor_hostname cannot be used as replacement for compute hostname. This patch fixes the problem by switching to list_services which returns compute hostnames. Change-Id: I948429075e71e11e091703c4b12378c71c37bc29
126 lines
5.2 KiB
Python
126 lines
5.2 KiB
Python
# Copyright 2013 IBM Corp.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from tempest.common import tempest_fixtures as fixtures
|
|
from tempest.common import utils
|
|
from tempest.lib.common.utils import data_utils
|
|
from tempest.lib import decorators
|
|
from tempest.scenario import manager
|
|
|
|
|
|
class TestAggregatesBasicOps(manager.ScenarioTest):
|
|
"""Creates an aggregate within an availability zone
|
|
|
|
Adds a host to the aggregate
|
|
Checks aggregate details
|
|
Updates aggregate's name
|
|
Removes host from aggregate
|
|
Deletes aggregate
|
|
"""
|
|
|
|
credentials = ['primary', 'admin']
|
|
|
|
@classmethod
|
|
def setup_clients(cls):
|
|
super(TestAggregatesBasicOps, cls).setup_clients()
|
|
# Use admin client by default
|
|
cls.aggregates_client = cls.os_admin.aggregates_client
|
|
cls.services_client = cls.os_admin.services_client
|
|
|
|
def _create_aggregate(self, **kwargs):
|
|
aggregate = (self.aggregates_client.create_aggregate(**kwargs)
|
|
['aggregate'])
|
|
self.addCleanup(self.aggregates_client.delete_aggregate,
|
|
aggregate['id'])
|
|
aggregate_name = kwargs['name']
|
|
availability_zone = kwargs['availability_zone']
|
|
self.assertEqual(aggregate['name'], aggregate_name)
|
|
self.assertEqual(aggregate['availability_zone'], availability_zone)
|
|
return aggregate
|
|
|
|
def _get_host_name(self):
|
|
svc_list = self.services_client.list_services(
|
|
binary='nova-compute')['services']
|
|
self.assertNotEmpty(svc_list)
|
|
return svc_list[0]['host']
|
|
|
|
def _add_host(self, aggregate_id, host):
|
|
aggregate = (self.aggregates_client.add_host(aggregate_id, host=host)
|
|
['aggregate'])
|
|
self.addCleanup(self._remove_host, aggregate['id'], host)
|
|
self.assertIn(host, aggregate['hosts'])
|
|
|
|
def _remove_host(self, aggregate_id, host):
|
|
aggregate = self.aggregates_client.remove_host(aggregate_id, host=host)
|
|
self.assertNotIn(host, aggregate['aggregate']['hosts'])
|
|
|
|
def _check_aggregate_details(self, aggregate, aggregate_name, azone,
|
|
hosts, metadata):
|
|
aggregate = (self.aggregates_client.show_aggregate(aggregate['id'])
|
|
['aggregate'])
|
|
self.assertEqual(aggregate_name, aggregate['name'])
|
|
self.assertEqual(azone, aggregate['availability_zone'])
|
|
self.assertEqual(hosts, aggregate['hosts'])
|
|
for meta_key in metadata:
|
|
self.assertIn(meta_key, aggregate['metadata'])
|
|
self.assertEqual(metadata[meta_key],
|
|
aggregate['metadata'][meta_key])
|
|
|
|
def _set_aggregate_metadata(self, aggregate, meta):
|
|
aggregate = self.aggregates_client.set_metadata(aggregate['id'],
|
|
metadata=meta)
|
|
|
|
for key in meta.keys():
|
|
self.assertEqual(meta[key],
|
|
aggregate['aggregate']['metadata'][key])
|
|
|
|
def _update_aggregate(self, aggregate, aggregate_name,
|
|
availability_zone):
|
|
aggregate = self.aggregates_client.update_aggregate(
|
|
aggregate['id'], name=aggregate_name,
|
|
availability_zone=availability_zone)['aggregate']
|
|
self.assertEqual(aggregate['name'], aggregate_name)
|
|
self.assertEqual(aggregate['availability_zone'], availability_zone)
|
|
return aggregate
|
|
|
|
@decorators.idempotent_id('cb2b4c4f-0c7c-4164-bdde-6285b302a081')
|
|
@decorators.attr(type='slow')
|
|
@utils.services('compute')
|
|
def test_aggregate_basic_ops(self):
|
|
self.useFixture(fixtures.LockFixture('availability_zone'))
|
|
az = 'foo_zone'
|
|
aggregate_name = data_utils.rand_name('aggregate-scenario')
|
|
aggregate = self._create_aggregate(name=aggregate_name,
|
|
availability_zone=az)
|
|
|
|
metadata = {'meta_key': 'meta_value'}
|
|
self._set_aggregate_metadata(aggregate, metadata)
|
|
|
|
host = self._get_host_name()
|
|
self._add_host(aggregate['id'], host)
|
|
self._check_aggregate_details(aggregate, aggregate_name, az, [host],
|
|
metadata)
|
|
|
|
aggregate_name = data_utils.rand_name('renamed-aggregate-scenario')
|
|
# Updating the name alone. The az must be specified again otherwise
|
|
# the tempest client would send None in the put body
|
|
aggregate = self._update_aggregate(aggregate, aggregate_name, az)
|
|
|
|
new_metadata = {'foo': 'bar'}
|
|
self._set_aggregate_metadata(aggregate, new_metadata)
|
|
|
|
self._check_aggregate_details(aggregate, aggregate['name'], az,
|
|
[host], new_metadata)
|