From cde63ed0034515bc8f953b4e4e99e81698dfac72 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Wed, 3 Dec 2025 22:07:23 +0900 Subject: [PATCH] Fix region query The list region API in keystone has no "name" concept. The region name is actually presented by the "id" field and is unique. Use get region API instead. Closes-Bug: #2131974 Change-Id: I42200f7ef56352ecfb8dbc22b6e1709333ccf274 Signed-off-by: Takashi Kajinami --- oslo_limit/fixture.py | 18 +++++++++-------- oslo_limit/limit.py | 16 ++++++--------- oslo_limit/tests/test_limit.py | 37 ++++------------------------------ 3 files changed, 20 insertions(+), 51 deletions(-) diff --git a/oslo_limit/fixture.py b/oslo_limit/fixture.py index 1964961..70f0b7d 100644 --- a/oslo_limit/fixture.py +++ b/oslo_limit/fixture.py @@ -36,13 +36,15 @@ def _fake_services( ) -def _fake_regions( - **query: dict[str, Any], -) -> Generator[_region.Region, None, None]: - # we are the only ones calling this, so we know exactly what we should be - # calling it with - assert set(query) == {'name'} - yield sdk_fakes.generate_fake_resource(_region.Region, name=query['name']) +def _fake_region( + region: str | _region.Region, +) -> _region.Region: + if isinstance(region, str): + region_id = region + else: + region_id = region.id + + return sdk_fakes.generate_fake_resource(_region.Region, id=region_id) def _fake_endpoints( @@ -156,7 +158,7 @@ class LimitFixture(fixtures.Fixture): # Then, requests by name self.mock_conn.services.side_effect = _fake_services - self.mock_conn.regions.side_effect = _fake_regions + self.mock_conn.get_region.side_effect = _fake_region self.mock_conn.endpoints.side_effect = _fake_endpoints # Finally, fake the actual limits and registered limits calls diff --git a/oslo_limit/limit.py b/oslo_limit/limit.py index 1b584ed..18d0e4c 100644 --- a/oslo_limit/limit.py +++ b/oslo_limit/limit.py @@ -396,18 +396,14 @@ class _EnforcerUtils: # find region (if any) if CONF.oslo_limit.endpoint_region_name is not None: - regions = self.connection.regions( # type: ignore - name=CONF.oslo_limit.endpoint_region_name - ) - regions = list(regions) - - if len(regions) > 1: - raise ValueError("Multiple regions found") - - if len(regions) == 0: + try: + region = self.connection.get_region( # type: ignore + CONF.oslo_limit.endpoint_region_name + ) + except os_exceptions.ResourceNotFound: raise ValueError("Region not found") - region_id = regions[0].id + region_id = region.id else: region_id = None diff --git a/oslo_limit/tests/test_limit.py b/oslo_limit/tests/test_limit.py index be1d52c..2792dbf 100644 --- a/oslo_limit/tests/test_limit.py +++ b/oslo_limit/tests/test_limit.py @@ -535,7 +535,7 @@ class TestEnforcerUtils(base.BaseTestCase): fake_endpoint = endpoint.Endpoint() self.mock_conn.endpoints.return_value = [fake_endpoint] fake_region = region.Region(id='REGION_ID') - self.mock_conn.regions.return_value = [fake_region] + self.mock_conn.get_region.return_value = fake_region utils = limit._EnforcerUtils() @@ -544,7 +544,7 @@ class TestEnforcerUtils(base.BaseTestCase): self.mock_conn.services.assert_called_once_with( type='SERVICE_TYPE', name='SERVICE_NAME' ) - self.mock_conn.regions.assert_called_once_with(name='regionOne') + self.mock_conn.get_region.assert_called_once_with('regionOne') self.mock_conn.endpoints.assert_called_once_with( service_id='SERVICE_ID', region_id='REGION_ID', interface='public' ) @@ -564,7 +564,7 @@ class TestEnforcerUtils(base.BaseTestCase): self.mock_conn.services.return_value = [fake_service] fake_endpoint = endpoint.Endpoint() self.mock_conn.endpoints.return_value = [fake_endpoint] - self.mock_conn.regions.return_value = [] + self.mock_conn.get_region.side_effect = os_exceptions.ResourceNotFound self.assertRaises(ValueError, limit._EnforcerUtils) @@ -572,36 +572,7 @@ class TestEnforcerUtils(base.BaseTestCase): self.mock_conn.services.assert_called_once_with( type='SERVICE_TYPE', name='SERVICE_NAME' ) - self.mock_conn.regions.assert_called_once_with(name='regionOne') - self.mock_conn.endpoints.assert_not_called() - - def test_get_endpoint_lookup_with_mutliple_regions(self): - self.config_fixture.config(group='oslo_limit', endpoint_id=None) - self.config_fixture.config( - group='oslo_limit', endpoint_service_type='SERVICE_TYPE' - ) - self.config_fixture.config( - group='oslo_limit', endpoint_service_name='SERVICE_NAME' - ) - self.config_fixture.config( - group='oslo_limit', endpoint_region_name='regionOne' - ) - fake_service = service.Service(id='SERVICE_ID') - self.mock_conn.services.return_value = [fake_service] - fake_endpoint = endpoint.Endpoint() - self.mock_conn.endpoints.return_value = [fake_endpoint] - self.mock_conn.regions.return_value = [ - region.Region(id='REGION_ID1'), - region.Region(id='REGION_ID2'), - ] - - self.assertRaises(ValueError, limit._EnforcerUtils) - - self.mock_conn.get_endpoint.assert_not_called() - self.mock_conn.services.assert_called_once_with( - type='SERVICE_TYPE', name='SERVICE_NAME' - ) - self.mock_conn.regions.assert_called_once_with(name='regionOne') + self.mock_conn.get_region.assert_called_once_with('regionOne') self.mock_conn.endpoints.assert_not_called() def test_get_registered_limit_empty(self):