blazar-tempest-plugin/blazar_tempest_plugin/tests/scenario/resource_reservation_scenario.py
Masahito Muroi b719662d91 Import TimeoutException from tempest.lib.exceptions module
Tempest defines TimeoutException in the tempest.lib.exceptions module.
However the Blazar Tempest plugin imports the exception from the
tempest.exceptions module. It causes AttributeError instead of raising
TimeoutException.

Change-Id: I1a57b4cc66ae32793f93264c3b5f6c7ae67a8e4c
2019-03-19 10:09:23 +00:00

145 lines
5.8 KiB
Python

# Copyright 2014 Intel Corporation
# 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 oslo_log import log
from tempest import clients as tempestclients
from tempest import config
from tempest import exceptions
from tempest.lib.common.utils import test_utils
from tempest.lib import exceptions as lib_exceptions
from blazar_tempest_plugin.services.reservation import (
reservation_client as clients)
from blazar_tempest_plugin.tests.scenario import manager_freeze as manager
CONF = config.CONF
LOG = log.getLogger(__name__)
class ResourceReservationScenarioTest(manager.ScenarioTest):
"""Base class for resource reservation scenario tests."""
credentials = ['primary', 'admin']
@classmethod
def setup_clients(cls):
super(ResourceReservationScenarioTest, cls).setup_clients()
if not CONF.service_available.blazar:
raise cls.skipException("Resource reservation support is"
"required")
cred_provider = cls._get_credentials_provider()
creds = cred_provider.get_credentials('admin')
auth_prov = tempestclients.get_auth_provider(creds._credentials)
cls.os_admin.resource_reservation_client = (
clients.ResourceReservationV1Client(auth_prov,
'reservation',
CONF.identity.region))
cls.reservation_client = (
cls.os_admin.resource_reservation_client)
def get_lease_by_name(self, lease_name):
# the same as the blazarclient does it: ask for the entire list
lease_list = self.reservation_client.list_lease()
named_lease = []
# and then search by lease_name
named_lease = [lease for lease in lease_list
if lease['name'] == lease_name]
if named_lease:
return self.reservation_client.get_lease(
named_lease[0]['id'])
else:
message = "Unable to find lease with name '%s'" % lease_name
raise exceptions.NotFound(message)
def delete_lease(self, lease_id):
return self.reservation_client.delete_lease(lease_id)
def wait_for_lease_end(self, lease_id):
def check_lease_end():
try:
lease = self.reservation_client.get_lease(lease_id)['lease']
if lease:
events = lease['events']
return len([evt for evt in events
if evt['event_type'] == 'end_lease' and
evt['status'] == 'DONE']) > 0
else:
LOG.info("Lease with id %s is empty", lease_id)
except Exception as e:
LOG.info("Unable to find lease with id %(lease_id)s. "
"Exception: %(message)s",
{'lease_id': lease_id, 'message': str(e)})
return True
if not test_utils.call_until_true(
check_lease_end,
CONF.resource_reservation.lease_end_timeout,
CONF.resource_reservation.lease_interval):
message = "Timed out waiting for lease to change status to DONE"
raise lib_exceptions.TimeoutException(message)
def wait_for_lease_status(self, lease_id, status):
def check_lease_status():
try:
lease = self.reservation_client.get_lease(lease_id)['lease']
if lease and lease['status'] == status:
return True
else:
LOG.info("Lease with id %s is not %s, but %s",
lease_id, status, lease['status'])
except Exception as e:
LOG.info("Unable to find lease with id %(lease_id)s. "
"Exception: %(message)s",
{'lease_id': lease_id, 'message': str(e)})
return False
if not test_utils.call_until_true(
check_lease_status,
CONF.resource_reservation.lease_end_timeout,
CONF.resource_reservation.lease_interval):
message = ("Timed out waiting for lease to change status "
"to %s" % status)
raise lib_exceptions.TimeoutException(message)
def is_flavor_enough(self, flavor_id, image_id):
image = self.compute_images_client.show_image(image_id)['image']
flavor = self.flavors_client.show_flavor(flavor_id)['flavor']
return image['minDisk'] <= flavor['disk']
def fetch_one_compute_host(self):
"""Returns the first host listed in nova-compute services."""
compute = next(iter(self.os_admin.services_client.
list_services(binary='nova-compute')['services']))
return compute
def _add_host_once(self):
host = self.fetch_one_compute_host()
hosts = self.reservation_client.list_host()['hosts']
try:
# TODO(masahito): Fix the check not to depend on '0' fixed check.
# When the scenario test covers the monitor resource feature, there
# are multiple compute hosts.
[h for h in hosts if h['hypervisor_hostname'] == host['host']][0]
except IndexError:
self.reservation_client.create_host({'name': host['host']})
return host