diff --git a/releasenotes/notes/add-odata-version-header-96dc8179c0e2e9bd.yaml b/releasenotes/notes/add-odata-version-header-96dc8179c0e2e9bd.yaml new file mode 100644 index 00000000..12d81380 --- /dev/null +++ b/releasenotes/notes/add-odata-version-header-96dc8179c0e2e9bd.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Improve interoperability by including the recommended OData-Version + header in outgoing Redfish requests. diff --git a/sushy/connector.py b/sushy/connector.py index cae99c16..9c4d2925 100644 --- a/sushy/connector.py +++ b/sushy/connector.py @@ -71,6 +71,9 @@ class Connector(object): :raises: HTTPError """ url = parse.urljoin(self._url, path) + headers = headers or {} + if not any(k.lower() == 'odata-version' for k in headers): + headers['OData-Version'] = '4.0' # TODO(lucasagomes): We should mask the data to remove sensitive # information LOG.debug('HTTP request: %(method)s %(url)s; headers: %(headers)s; ' diff --git a/sushy/tests/unit/test_connector.py b/sushy/tests/unit/test_connector.py index 0547563a..1a90e305 100644 --- a/sushy/tests/unit/test_connector.py +++ b/sushy/tests/unit/test_connector.py @@ -146,15 +146,18 @@ class ConnectorOpTestCase(base.TestCase): json=self.data, headers=self.headers) def test_ok_delete(self): + expected_headers = self.headers.copy() + expected_headers['OData-Version'] = '4.0' self.conn._op('DELETE', path='fake/path', headers=self.headers.copy()) self.request.assert_called_once_with( 'DELETE', 'http://foo.bar:1234/fake/path', - headers=self.headers, json=None) + headers=expected_headers, json=None) def test_ok_post_with_session(self): self.conn._session.headers = {} self.conn._session.headers['X-Auth-Token'] = 'asdf1234' expected_headers = self.headers.copy() + expected_headers['OData-Version'] = '4.0' self.conn._op('POST', path='fake/path', headers=self.headers, data=self.data) self.request.assert_called_once_with( @@ -163,6 +166,34 @@ class ConnectorOpTestCase(base.TestCase): self.assertEqual(self.conn._session.headers, {'X-Auth-Token': 'asdf1234'}) + def test_odata_version_header_redfish(self): + path = '/redfish/v1/path' + headers = dict(self.headers) + expected_headers = dict(self.headers) + expected_headers['OData-Version'] = '4.0' + self.request.reset_mock() + self.conn._op('GET', path=path, headers=headers) + self.request.assert_called_once_with( + 'GET', 'http://foo.bar:1234' + path, + headers=expected_headers, json=None) + + def test_odata_version_header_redfish_no_headers(self): + path = '/redfish/v1/bar' + expected_headers = {'OData-Version': '4.0'} + self.conn._op('GET', path=path) + self.request.assert_called_once_with( + 'GET', 'http://foo.bar:1234' + path, + headers=expected_headers, json=None) + + def test_odata_version_header_redfish_existing_header(self): + path = '/redfish/v1/foo' + headers = {'OData-Version': '3.0'} + expected_headers = dict(headers) + self.conn._op('GET', path=path, headers=headers) + self.request.assert_called_once_with( + 'GET', 'http://foo.bar:1234' + path, + headers=expected_headers, json=None) + def test_timed_out_session_unable_to_create_session(self): self.conn._auth.can_refresh_session.return_value = False self.conn._session = self.session