tests: Handle removal of block-storage v2 API

Cinder recently removed their v2 API [1] which is causing the functional
tests to fail. Improve our 'is_service_enabled' test helper to use the
'versions show' command, which queries the service catalog and can give
us information about the service version as well as answer the more
general "is this service available" question. We also resolve a
long-standing TODO in the process.

[1] https://review.opendev.org/c/openstack/cinder/+/792299

Change-Id: I381069357aa008344e15327adf3a863c0c2e1f04
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane 2021-07-23 12:48:23 +01:00
parent 4891bb3820
commit c1209601b4
4 changed files with 43 additions and 29 deletions

View File

@ -68,17 +68,24 @@ class TestCase(testtools.TestCase):
) )
@classmethod @classmethod
def is_service_enabled(cls, service): def is_service_enabled(cls, service, version=None):
"""Ask client cloud if service is available""" """Ask client cloud if service is available
cmd = ('service show -f value -c enabled {service}'
.format(service=service)) :param service: The service name or type. This should be either an
try: exact match to what is in the catalog or a known official value or
return "True" in cls.openstack(cmd) alias from service-types-authority
except exceptions.CommandFailed as e: :param version: Optional version. This should be a major version, e.g.
if "No service with a type, name or ID of" in str(e): '2.0'
return False :returns: True if the service is enabled and optionally provides the
else: specified API version, else False
raise # Unable to determine if service is enabled """
ret = cls.openstack(
f'versions show --service {service} -f value -c Version'
).splitlines()
if version:
return version in ret
return bool(ret)
@classmethod @classmethod
def is_extension_enabled(cls, alias): def is_extension_enabled(cls, alias):

View File

@ -20,25 +20,14 @@ class BaseVolumeTests(volume_base.BaseVolumeTests):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
super(BaseVolumeTests, cls).setUpClass() super().setUpClass()
# TODO(dtroyer): This needs to be updated to specifically check for cls.haz_volume_v1 = cls.is_service_enabled('block-storage', '1.0')
# Volume v1 rather than just 'volume', but for now
# that is enough until we get proper version negotiation
cls.haz_volume_v1 = cls.is_service_enabled('volume')
def setUp(self): def setUp(self):
super(BaseVolumeTests, self).setUp() super().setUp()
# This class requires Volume v1 if not self.haz_volume_v1:
# if not self.haz_volume_v1: self.skipTest("No Volume v1 service present")
# self.skipTest("No Volume v1 service present")
# TODO(dtroyer): We really want the above to work but right now
# (12Sep2017) DevStack still creates a 'volume'
# service type even though there is no service behind
# it. Until that is fixed we need to just skip the
# volume v1 functional tests in master.
self.skipTest("No Volume v1 service present")
ver_fixture = fixtures.EnvironmentVariable( ver_fixture = fixtures.EnvironmentVariable(
'OS_VOLUME_API_VERSION', '1' 'OS_VOLUME_API_VERSION', '1'

View File

@ -18,8 +18,17 @@ from openstackclient.tests.functional.volume import base
class BaseVolumeTests(base.BaseVolumeTests): class BaseVolumeTests(base.BaseVolumeTests):
"""Base class for Volume functional tests. """ """Base class for Volume functional tests. """
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.haz_volume_v2 = cls.is_service_enabled('block-storage', '2.0')
def setUp(self): def setUp(self):
super(BaseVolumeTests, self).setUp() super().setUp()
if not self.haz_volume_v2:
self.skipTest("No Volume v2 service present")
ver_fixture = fixtures.EnvironmentVariable( ver_fixture = fixtures.EnvironmentVariable(
'OS_VOLUME_API_VERSION', '2' 'OS_VOLUME_API_VERSION', '2'
) )

View File

@ -18,8 +18,17 @@ from openstackclient.tests.functional.volume import base
class BaseVolumeTests(base.BaseVolumeTests): class BaseVolumeTests(base.BaseVolumeTests):
"""Base class for Volume functional tests. """ """Base class for Volume functional tests. """
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.haz_volume_v3 = cls.is_service_enabled('block-storage', '3.0')
def setUp(self): def setUp(self):
super(BaseVolumeTests, self).setUp() super().setUp()
if not self.haz_volume_v3:
self.skipTest("No Volume v3 service present")
ver_fixture = fixtures.EnvironmentVariable( ver_fixture = fixtures.EnvironmentVariable(
'OS_VOLUME_API_VERSION', '3' 'OS_VOLUME_API_VERSION', '3'
) )