From d35ff68cc76f4adada2a19e5fc393f222476eb69 Mon Sep 17 00:00:00 2001 From: Miguel Caballer Date: Thu, 30 Jul 2026 10:00:57 +0200 Subject: [PATCH] Do not use service_name for endpoint selection. Fix: #2074 --- CHANGES.rst | 7 ++++++ libcloud/common/openstack.py | 2 +- libcloud/test/common/test_openstack.py | 33 ++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 88b983e4bf..c93121c0aa 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -14,6 +14,13 @@ Common Compute ~~~~~~~ +- [OpenStack] Select service catalog endpoints by service type without filtering + by the default service name. The service name is only used as a filter when + explicitly provided via ``ex_force_service_name``. + + (#2074) + [Miguel Caballer - @micafer] + - [SSH] Support paramiko 4 RSA key support has been removed as of paramiko 4, so only import it diff --git a/libcloud/common/openstack.py b/libcloud/common/openstack.py index ad3ada1756..ea342e8810 100644 --- a/libcloud/common/openstack.py +++ b/libcloud/common/openstack.py @@ -308,7 +308,7 @@ def get_endpoint(self): :returns: url of the relevant endpoint for the driver """ service_type = self.service_type - service_name = self.service_name + service_name = None service_region = self.service_region if self._ex_force_service_type: diff --git a/libcloud/test/common/test_openstack.py b/libcloud/test/common/test_openstack.py index 2bfeb76401..b2a99fb9e9 100644 --- a/libcloud/test/common/test_openstack.py +++ b/libcloud/test/common/test_openstack.py @@ -57,6 +57,39 @@ def test_set_microversion(self): headers = self.connection.add_default_headers({}) self.assertEqual(headers["OpenStack-API-Version"], "volume 2.67") + def test_get_endpoint_does_not_filter_by_default_service_name(self): + self.connection.service_catalog = Mock() + self.connection.service_catalog.get_endpoint.return_value.url = ( + "https://compute.example.com" + ) + self.connection.service_type = "compute" + self.connection.service_name = "nova" + self.connection.service_region = "RegionOne" + + endpoint = self.connection.get_endpoint() + + self.assertEqual(endpoint, "https://compute.example.com") + self.connection.service_catalog.get_endpoint.assert_called_once_with( + service_type="compute", name=None, region="RegionOne" + ) + + def test_get_endpoint_filters_by_explicit_service_name(self): + self.connection.service_catalog = Mock() + self.connection.service_catalog.get_endpoint.return_value.url = ( + "https://compute.example.com" + ) + self.connection.service_type = "compute" + self.connection.service_name = "nova" + self.connection.service_region = "RegionOne" + self.connection._ex_force_service_name = "custom-nova" + + endpoint = self.connection.get_endpoint() + + self.assertEqual(endpoint, "https://compute.example.com") + self.connection.service_catalog.get_endpoint.assert_called_once_with( + service_type="compute", name="custom-nova", region="RegionOne" + ) + @patch("libcloud.common.base.ConnectionUserAndKey.request") def test_request(self, mock_request): OpenStackBaseConnection.conn_class._raw_data = ""