Add microversion headers to root ('/') endpoint

Adds microversion headers to the root endpoint so the '/' and '/v1'
endpoints consistently include microversion headers.

Closes-Bug: #2079023
Change-Id: Iea78b33e04e256c1139dd46a25f6d6a2be8e1ccc
This commit is contained in:
cid 2024-09-13 11:24:54 +01:00
parent d44a658836
commit b19507d647
4 changed files with 30 additions and 4 deletions

View File

@ -38,6 +38,7 @@ class RootController(object):
@method.expose() @method.expose()
def index(self, *args): def index(self, *args):
V1.add_version_attributes()
if args: if args:
pecan.abort(404) pecan.abort(404)
return root() return root()
@ -49,6 +50,7 @@ class RootController(object):
It redirects the request to the default version of the ironic API It redirects the request to the default version of the ironic API
if the version number is not specified in the url. if the version number is not specified in the url.
""" """
V1.add_version_attributes()
# support paths which are missing the first version element # support paths which are missing the first version element
if primary_key and primary_key != version.ID_VERSION1: if primary_key and primary_key != version.ID_VERSION1:

View File

@ -141,8 +141,7 @@ class Controller(object):
# NOTE: The reason why v1() it's being called for every # NOTE: The reason why v1() it's being called for every
# request is because we need to get the host url from # request is because we need to get the host url from
# the request object to make the links. # the request object to make the links.
self._add_version_attributes() if api.request.method not in ('GET', 'HEAD'):
if api.request.method != "GET":
pecan.abort(http_client.METHOD_NOT_ALLOWED) pecan.abort(http_client.METHOD_NOT_ALLOWED)
return v1() return v1()
@ -169,7 +168,7 @@ class Controller(object):
'max': versions.max_version_string()}, 'max': versions.max_version_string()},
headers=headers) headers=headers)
def _add_version_attributes(self): def add_version_attributes(self):
v = base.Version(api.request.headers, versions.min_version_string(), v = base.Version(api.request.headers, versions.min_version_string(),
versions.max_version_string()) versions.max_version_string())
@ -186,7 +185,6 @@ class Controller(object):
@pecan.expose() @pecan.expose()
def _lookup(self, primary_key, *remainder): def _lookup(self, primary_key, *remainder):
self._add_version_attributes()
controller = self._subcontroller_map.get(primary_key) controller = self._subcontroller_map.get(primary_key)
if not controller: if not controller:

View File

@ -29,6 +29,28 @@ class TestV1Routing(api_base.BaseApiTest):
mock.ANY, mock.ANY,
mock.ANY) mock.ANY)
def test_microversion_headers(self):
# Check root endpoint
response = self.app.head('/')
self.assertEqual(200, response.status_int)
self.assertIn('X-OpenStack-Ironic-API-Minimum-Version',
response.headers)
self.assertIn('X-OpenStack-Ironic-API-Maximum-Version',
response.headers)
self._check_version.reset_mock()
# Check v1 endpoint
response = self.app.head('/v1')
self.assertEqual(200, response.status_int)
self.assertIn('X-OpenStack-Ironic-API-Minimum-Version',
response.headers)
self.assertIn('X-OpenStack-Ironic-API-Maximum-Version',
response.headers)
# -check_version should be called only once
self.assertEqual(1, self._check_version.call_count)
def test_min_version(self): def test_min_version(self):
response = self.get_json( response = self.get_json(
'/', '/',

View File

@ -0,0 +1,4 @@
---
fixes:
- |
Adds microversion headers to the root ('/') endpoint.