Files
tobiko/tobiko/openstack/nova/_service.py
Eduardo Olivares dec1661438 Reduce retry interval from 5 to 3 for all loops involving OSP API requests
Apparently, sending requests to Openstack APIs on Podified environments
every 5 seconds is problematic and tobiko tests are unstable due to
this.
In two previous patches, this change was already done for heat and
glance requests.
With this patch, the interval has been changed for all loops that
involve retries to any Openstack APIs.

OSPCIX-844

Change-Id: If0bb72b6e46683425429e3b93d3993fb57221799
2025-06-17 10:54:54 +02:00

84 lines
3.0 KiB
Python

# Copyright 2019 Red Hat
#
# 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 __future__ import absolute_import
import json
import typing
from keystoneauth1 import exceptions as ks_exceptions
from novaclient import exceptions as nc_exceptions
from oslo_log import log
import tobiko
from tobiko.openstack.nova import _client
LOG = log.getLogger(__name__)
class NovaServiceException(tobiko.TobikoException):
pass
class NovaServicesNotfound(NovaServiceException):
message = "Nova services not found ({attributes})"
class NovaServicesFailed(NovaServiceException):
message = "Nova services are failed:\n{details}"
def services_details(services: typing.List):
# pylint: disable=protected-access
return json.dumps([service._info for service in services],
indent=4, sort_keys=True)
def wait_for_services_up(retry: typing.Optional[tobiko.Retry] = None,
**list_services_params):
for attempt in tobiko.retry(other_retry=retry,
default_timeout=300.,
default_interval=3.):
try:
services = _client.list_services(**list_services_params)
except (ks_exceptions.connection.ConnectFailure,
nc_exceptions.ClientException):
# Re-raises this exception in case this is the last attempt
attempt.check_limits()
continue
LOG.debug(f"Found {len(services)} Nova services")
try:
if not services:
raise NovaServicesNotfound(
attributes=json.dumps(list_services_params))
heathy_services = services.with_attributes(state='up')
LOG.debug(f"Found {len(heathy_services)} healthy Nova services")
failed_services = [service
for service in services
if service not in heathy_services]
LOG.debug(f"Found {len(failed_services)} failed Nova services")
if failed_services:
details = services_details(failed_services)
LOG.info(f"Failed Nova services:\n{details}")
raise NovaServicesFailed(details=details)
LOG.info('All nova services are up!')
break # all Nova services are healthy
except NovaServiceException:
# Re-raises this exception in case this is the last attempt
attempt.check_limits()
continue