From 88fffeabd796e76250518d332d142e7cb46cebd2 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Tue, 7 May 2024 13:51:33 +0100 Subject: [PATCH] tests: Add ability to configure fake server API version This beats the horrible mess of mocks we have created for ourselves. Change-Id: I8af3ce0a0b10f52e2124ec86f306327ff3474982 Signed-off-by: Stephen Finucane --- .../tests/unit/compute/v2/fakes.py | 24 +++++++++++++++++-- openstackclient/tests/unit/volume/v2/fakes.py | 22 +++++++++++++++++ openstackclient/tests/unit/volume/v3/fakes.py | 23 ++++++++++++++++++ .../volume/v3/test_block_storage_manage.py | 3 +-- .../tests/unit/volume/v3/test_service.py | 2 +- 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/openstackclient/tests/unit/compute/v2/fakes.py b/openstackclient/tests/unit/compute/v2/fakes.py index f3042f32b2..614bd90281 100644 --- a/openstackclient/tests/unit/compute/v2/fakes.py +++ b/openstackclient/tests/unit/compute/v2/fakes.py @@ -15,9 +15,11 @@ import copy import random +import re from unittest import mock import uuid +from keystoneauth1 import discover from novaclient import api_versions from openstack.compute.v2 import _proxy from openstack.compute.v2 import aggregate as _aggregate @@ -143,8 +145,6 @@ class FakeComputev2Client: self.management_url = kwargs['endpoint'] - self.api_version = api_versions.APIVersion('2.1') - class FakeClientMixin: def setUp(self): @@ -169,6 +169,26 @@ class FakeClientMixin: self.compute_sdk_client = ( self.app.client_manager.sdk_connection.compute ) + self.set_compute_api_version() # default to the lowest + + def set_compute_api_version(self, version: str = '2.1'): + """Set a fake server version. + + :param version: The fake microversion to "support". This should be a + string of format '2.xx'. + :returns: None + """ + assert re.match(r'2.\d+', version) + + self.compute_client.api_version = api_versions.APIVersion(version) + + self.compute_sdk_client.default_microversion = version + self.compute_sdk_client.get_endpoint_data.return_value = ( + discover.EndpointData( + min_microversion='2.1', # nova has not bumped this yet + max_microversion=version, + ) + ) class TestComputev2( diff --git a/openstackclient/tests/unit/volume/v2/fakes.py b/openstackclient/tests/unit/volume/v2/fakes.py index 1c3a6864e1..9ba3b2bf5a 100644 --- a/openstackclient/tests/unit/volume/v2/fakes.py +++ b/openstackclient/tests/unit/volume/v2/fakes.py @@ -14,11 +14,13 @@ import copy import random +import typing as ty from unittest import mock import uuid # FIXME(stephenfin): We are using v3 resource versions despite being v2 fakes from cinderclient import api_versions +from keystoneauth1 import discover from openstack.block_storage.v2 import _proxy as block_storage_v2_proxy from openstack.block_storage.v2 import backup as _backup from openstack.block_storage.v3 import capabilities as _capabilities @@ -105,6 +107,26 @@ class FakeClientMixin: spec=block_storage_v2_proxy.Proxy, ) self.volume_sdk_client = self.app.client_manager.sdk_connection.volume + self.set_volume_api_version() # default to the lowest + + def set_volume_api_version(self, version: ty.Optional[str] = None): + """Set a fake block storage API version. + + :param version: The fake microversion to "support". This must be None + since cinder v2 didn't support microversions. + :returns: None + """ + assert version is None + + self.volume_client.api_version = None + + self.volume_sdk_client.default_microversion = None + self.volume_sdk_client.get_endpoint_data.return_value = ( + discover.EndpointData( + min_microversion=None, + max_microversion=None, + ) + ) class TestVolume( diff --git a/openstackclient/tests/unit/volume/v3/fakes.py b/openstackclient/tests/unit/volume/v3/fakes.py index 0868de1423..925f2f7732 100644 --- a/openstackclient/tests/unit/volume/v3/fakes.py +++ b/openstackclient/tests/unit/volume/v3/fakes.py @@ -12,10 +12,12 @@ import copy import random +import re from unittest import mock import uuid from cinderclient import api_versions +from keystoneauth1 import discover from openstack.block_storage.v3 import _proxy from openstack.block_storage.v3 import availability_zone as _availability_zone from openstack.block_storage.v3 import backup as _backup @@ -97,6 +99,26 @@ class FakeClientMixin: spec=_proxy.Proxy, ) self.volume_sdk_client = self.app.client_manager.sdk_connection.volume + self.set_volume_api_version() # default to the lowest + + def set_volume_api_version(self, version: str = '3.0'): + """Set a fake block storage API version. + + :param version: The fake microversion to "support". This should be a + string of format '3.xx'. + :returns: None + """ + assert re.match(r'3.\d+', version) + + self.volume_client.api_version = api_versions.APIVersion(version) + + self.volume_sdk_client.default_microversion = version + self.volume_sdk_client.get_endpoint_data.return_value = ( + discover.EndpointData( + min_microversion='3.0', # cinder has not bumped this yet + max_microversion=version, + ) + ) class TestVolume( @@ -126,6 +148,7 @@ class TestVolume( # TODO(stephenfin): Check if the responses are actually the same create_one_snapshot = volume_v2_fakes.create_one_snapshot +create_one_service = volume_v2_fakes.create_one_service def create_one_availability_zone(attrs=None): diff --git a/openstackclient/tests/unit/volume/v3/test_block_storage_manage.py b/openstackclient/tests/unit/volume/v3/test_block_storage_manage.py index 54f4848154..ca892f8918 100644 --- a/openstackclient/tests/unit/volume/v3/test_block_storage_manage.py +++ b/openstackclient/tests/unit/volume/v3/test_block_storage_manage.py @@ -16,12 +16,11 @@ from cinderclient import api_versions from osc_lib import exceptions from openstackclient.tests.unit import utils as tests_utils -from openstackclient.tests.unit.volume.v2 import fakes as v2_volume_fakes from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes from openstackclient.volume.v3 import block_storage_manage -class TestBlockStorageManage(v2_volume_fakes.TestVolume): +class TestBlockStorageManage(volume_fakes.TestVolume): def setUp(self): super().setUp() diff --git a/openstackclient/tests/unit/volume/v3/test_service.py b/openstackclient/tests/unit/volume/v3/test_service.py index 92f4239bce..3333595513 100644 --- a/openstackclient/tests/unit/volume/v3/test_service.py +++ b/openstackclient/tests/unit/volume/v3/test_service.py @@ -14,7 +14,7 @@ from cinderclient import api_versions -from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes +from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes from openstackclient.volume.v3 import service