diff options
author | Dmitry Tantsur <dtantsur@protonmail.com> | 2019-09-23 14:26:37 +0200 |
---|---|---|
committer | Dmitry Tantsur <dtantsur@protonmail.com> | 2019-09-24 11:20:25 +0000 |
commit | cbd4418e09774098ed1d003faf7a1adcd42aec3a (patch) | |
tree | 20c0ac57a4a8df6ebb4b2b37d52710e1d108edcb | |
parent | 646838c8d8ecf92260cf984565a66f029eab796b (diff) | |
download | python-ironicclient-cbd4418e09774098ed1d003faf7a1adcd42aec3a.tar.gz |
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
(cherry picked from commit 7f003e1e045e3e20b824a94676310315f8fef9fc)
-rw-r--r-- | ironicclient/common/http.py | 6 | ||||
-rw-r--r-- | ironicclient/tests/unit/common/test_http.py | 7 | ||||
-rw-r--r-- | ironicclient/tests/unit/test_client.py | 16 | ||||
-rw-r--r-- | releasenotes/notes/typerror-132801fe4541fdb4.yaml | 7 |
4 files changed, 25 insertions, 11 deletions
diff --git a/ironicclient/common/http.py b/ironicclient/common/http.py index 8b2421c..9ff8f01 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 076ebdc..441e4ee 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 754119c..a420310 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 0000000..3538824 --- /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``. |