[placement] Add status and links fields to version document at /

According to the spec [1] the version discovery doc must have a status
and links for each version. For the primary version the status value
should be 'CURRENT'. For placement the version discovery doc and "self"
are the same thing, so the provided "self" href looks redundant, but it
makes keystoneauth1 happy when doing version discovery.

In placement, since there is only one version at the moment, set status
to CURRENT.

Add a gabbi test that verifies the presence of both fields and values.

Without these fields, use of placement with a client that follows the
documented version discovery process will fail to work.

As the version doc is not considered microversioned[2] and in any case
this is making version discovery work where it didn't before, this is
not a candidate for a microversion and can be backported to the
beginning of placement's history if we like.

I've updated the api-ref docs. In the process I made the max
microversion in the sample discovery doc a bit more realistic and
in alignment with these modern times.

[1] http://specs.openstack.org/openstack/api-wg/guidelines/microversion_specification.html#version-discovery
[2] http://eavesdrop.openstack.org/irclogs/%23openstack-sdks/%23openstack-sdks.2018-06-13.log.html#t2018-06-13T13:40:12

Change-Id: Ie602ab1768efbf103563d8f6b9d28965fc81021a
Closes-Bug: #1776668
This commit is contained in:
Chris Dent 2018-06-13 14:38:23 +01:00
parent 8ad3fd6f7c
commit 71e0ae2433
5 changed files with 37 additions and 1 deletions

View File

@ -32,6 +32,18 @@ def home(req):
'id': 'v%s' % min_version, 'id': 'v%s' % min_version,
'max_version': max_version, 'max_version': max_version,
'min_version': min_version, 'min_version': min_version,
# for now there is only ever one version, so it must be CURRENT
'status': 'CURRENT',
'links': [{
# Point back to this same URL as the root of this version.
# NOTE(cdent): We explicitly want this to be a relative-URL
# representation of "this same URL", otherwise placement needs
# to keep track of proxy addresses and the like, which we have
# avoided thus far, in order to construct full URLs. Placement
# is much easier to scale if we never track that stuff.
'rel': 'self',
'href': '',
}],
} }
version_json = jsonutils.dumps({'versions': [version_data]}) version_json = jsonutils.dumps({'versions': [version_data]})
req.response.body = encodeutils.to_utf8(version_json) req.response.body = encodeutils.to_utf8(version_json)

View File

@ -22,6 +22,8 @@ tests:
$.versions[0].max_version: /^\d+\.\d+$/ $.versions[0].max_version: /^\d+\.\d+$/
$.versions[0].min_version: /^\d+\.\d+$/ $.versions[0].min_version: /^\d+\.\d+$/
$.versions[0].id: v1.0 $.versions[0].id: v1.0
$.versions[0].status: CURRENT
$.versions[0].links[?rel = 'self'].href: ''
- name: unavailable microversion raises 406 - name: unavailable microversion raises 406
GET: / GET: /

View File

@ -538,6 +538,12 @@ version_id:
required: true required: true
description: > description: >
A common name for the version being described. Informative only. A common name for the version being described. Informative only.
version_links:
type: array
in: body
required: true
description: >
A list of links related to and describing this version.
version_max: version_max:
type: string type: string
in: body in: body
@ -550,6 +556,13 @@ version_min:
required: true required: true
description: > description: >
The minimum microversion that is supported. The minimum microversion that is supported.
version_status:
type: string
in: body
required: true
description: >
The status of the version being described. With placement this is
"CURRENT".
versions: versions:
type: array type: array
in: body in: body

View File

@ -41,6 +41,8 @@ Response
- id: version_id - id: version_id
- min_version: version_min - min_version: version_min
- max_version: version_max - max_version: version_max
- status: version_status
- links: version_links
Response Example Response Example
---------------- ----------------

View File

@ -3,7 +3,14 @@
{ {
"min_version" : "1.0", "min_version" : "1.0",
"id" : "v1.0", "id" : "v1.0",
"max_version" : "1.2" "max_version" : "1.28",
"status": "CURRENT",
"links": [
{
"href": "",
"rel": "self"
}
]
} }
] ]
} }