From 7f003e1e045e3e20b824a94676310315f8fef9fc Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Mon, 23 Sep 2019 14:26:37 +0200 Subject: [PATCH] Fix TypeError when using endpoint_override with SessionClient First, when endpoint cannot be detected from a session None is returned from get_endpoint, causing subsequent code to fail. This changes fixes it. Second, endpoint_override is not passed to a Session (it's an Adapter) property, doing it has no effect. Use get_endpoint from Adapter instead. Change-Id: Ia942858abe980abf95c1ca136767983e7a0a285e Story: #2006600 Task: #36763 --- ironicclient/common/http.py | 6 +++++- ironicclient/tests/unit/common/test_http.py | 7 +++++++ ironicclient/tests/unit/test_client.py | 16 ++++++---------- .../notes/typerror-132801fe4541fdb4.yaml | 7 +++++++ 4 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 releasenotes/notes/typerror-132801fe4541fdb4.yaml diff --git a/ironicclient/common/http.py b/ironicclient/common/http.py index 8b2421c76..9ff8f01c6 100644 --- a/ironicclient/common/http.py +++ b/ironicclient/common/http.py @@ -383,7 +383,11 @@ class SessionClient(VersionNegotiationMixin, adapter.LegacyJsonAdapter): super(SessionClient, self).__init__(**kwargs) endpoint_filter = self._get_endpoint_filter() - endpoint = self.session.get_endpoint(**endpoint_filter) + endpoint = self.get_endpoint(**endpoint_filter) + if endpoint is None: + raise exc.EndpointNotFound( + _('The Bare Metal API endpoint cannot be detected and was ' + 'not provided explicitly')) self.endpoint_trimmed = _trim_endpoint_api_version(endpoint) def _parse_version_headers(self, resp): diff --git a/ironicclient/tests/unit/common/test_http.py b/ironicclient/tests/unit/common/test_http.py index 076ebdcb0..441e4eeb5 100644 --- a/ironicclient/tests/unit/common/test_http.py +++ b/ironicclient/tests/unit/common/test_http.py @@ -403,6 +403,13 @@ class SessionClientTest(utils.BaseTestCase): user_agent=http.USER_AGENT) self.assertEqual(res, session.request.return_value) + @mock.patch.object(http.SessionClient, 'get_endpoint', autospec=True) + def test_endpoint_not_found(self, mock_get_endpoint): + mock_get_endpoint.return_value = None + + self.assertRaises(exc.EndpointNotFound, _session_client, + session=utils.mockSession({})) + @mock.patch.object(time, 'sleep', lambda *_: None) class RetriesTestCase(utils.BaseTestCase): diff --git a/ironicclient/tests/unit/test_client.py b/ironicclient/tests/unit/test_client.py index 754119c8a..a42031008 100644 --- a/ironicclient/tests/unit/test_client.py +++ b/ironicclient/tests/unit/test_client.py @@ -57,14 +57,11 @@ class ClientTest(utils.BaseTestCase): interface=expected_interface, region_name=kwargs.get('region_name')) if not {'endpoint'}.intersection(kwargs): - calls = [get_endpoint_call, - mock.call(interface=client.http_client.interface, - service_type=client.http_client.service_type, - region_name=client.http_client.region_name)] - self.assertEqual(calls, session.get_endpoint.call_args_list) - else: self.assertEqual([get_endpoint_call], session.get_endpoint.call_args_list) + else: + # we use adaper.get_endpoint instead of session.get_endpoint + self.assertFalse(session.get_endpoint.called) if 'os_ironic_api_version' in kwargs: # NOTE(TheJulia): This does not test the negotiation logic # as a request must be triggered in order for any version @@ -256,10 +253,9 @@ class ClientTest(utils.BaseTestCase): 'session': session, } iroclient.get_client('1', **kwargs) - endpoint_calls = 2 * [mock.call(service_type='baremetal', - interface=None, - region_name=None)] - self.assertEqual(endpoint_calls, session.get_endpoint.call_args_list) + session.get_endpoint.assert_called_once_with(service_type='baremetal', + interface=None, + region_name=None) def test_get_client_incorrect_session_passed(self): session = mock.Mock() diff --git a/releasenotes/notes/typerror-132801fe4541fdb4.yaml b/releasenotes/notes/typerror-132801fe4541fdb4.yaml new file mode 100644 index 000000000..35388243a --- /dev/null +++ b/releasenotes/notes/typerror-132801fe4541fdb4.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixes ``TypeError`` when the bare metal endpoint cannot be detected from + a session. A proper ``EndpointNotFound`` exception is raised now. + - | + Fixes using ``endpoint_override`` with the ``SessionClient``.