Merge "Remove Location header from createImage and createBackup response (spec)"

This commit is contained in:
Jenkins
2017-04-04 17:18:31 +00:00
committed by Gerrit Code Review

View File

@@ -0,0 +1,184 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
==================================================================
Remove Location header from createImage and createBackup responses
==================================================================
`<https://blueprints.launchpad.net/nova/+spec/remove-create-image-location-header-response>`_
The `createImage` and `createBackup` APIs return a `Location` header in the
response which is a URL pointing at what is most likely an internal Glance API
server, and is therefore not accessible to the end user. The URL is also not
versioned for the Image service, so unless the cloud provides an alias, the URL
is wrong anyway. This spec proposes to replace the Location header with a
simple response body json dict that contains the image_id for the snapshot
image.
Problem description
===================
The `createImage` and `createBackup` APIs return a `Location` header in the
response which is built from the ``CONF.glance.api_servers`` configuration
within Nova that is most likely using internal addresses for Glance, making it
unusable for the end user.
Client code like Tempest [1]_ and python-novaclient [2]_ have always ignored
the Location header in the response and just parsed the URL to get the image ID
and use it for their own ``GET /v2/images/{image_id}`` request.
Also, the URL in the Location header response is unversioned, but reading the
image service API reference docs for the versions document and the examples,
there is always a versioned prefix on the URL, e.g. ``GET /v1/images`` or
``GET /v2/images``. The fact the URL returned from nova is unversioned likely
means this is a legacy artifact before Glance was split out from Nova.
Use Cases
---------
As a user, I want to be able to use an accurate response from the `createImage`
and `createBackup` APIs to poll the status on the created snapshot image in the
Image service.
Proposed change
===============
This blueprint proposes to remove the Location header in the response and just
return the image_id in a response body dict with a new microversion for the
`createImage` and `createBackup` APIs.
Alternatives
------------
We could change the code that generates the Location header URL to use the
`public` interface for the `image` service type in the service catalog. This
would require more work since we would have to likely make the interface to
use configurable. Also, given how many client libraries are already ignoring
the Location header and not using it directly, but instead just parsing the
image ID from the URL, we can create a cleaner break from the broken behavior
of the past by returning a simple json response body with the value consumers
actually care about.
Data model impact
-----------------
None
REST API impact
---------------
In a microversion, the response for the `createImage` and `createBackup` server
action APIs will replace the `Location` header with a json dict response body
that contains a single `image_id` key mapped to the snapshot image ID (uuid)
created.
So rather than return a response with a header like::
Location: http://172.21.1.10:9292/images/f5d5b63b-e710-4d59-aa12-a9bd42f6652a
We will return a response with a body like::
{
'image_id': 'f5d5b63b-e710-4d59-aa12-a9bd42f6652a'
}
Security impact
---------------
None. This is arguably more secure since we would no longer be leaking internal
Glance API server IPs out of the public compute REST API.
Notifications impact
--------------------
None. There are actually ``compute.instance.snapshot.start`` and
``compute.instance.snapshot.end`` notifications but they do not actually
contain the snapshot image ID, for whatever reason, so there is no impact to
those existing notifications.
Other end user impact
---------------------
python-novaclient will need to be updated to handle the change in response
format in the microversion for the ``nova image-create`` CLI.
The ``nova backup`` CLI in python-novaclient does not currently parse the
Location header from the server response to print the snapshot image ID, so
there are no changes to python-novaclient for the `createBackup` change.
Performance Impact
------------------
None
Other deployer impact
---------------------
None
Developer impact
----------------
None
Implementation
==============
Assignee(s)
-----------
Primary assignee:
Matt Riedemann (mriedem)
Work Items
----------
* Add the microversion response change to the `createImage` and `createBackup`
server action APIs.
* Update documentation, including making a note in the API reference docs that
the Location header in the response before the microversion is likely broken.
Dependencies
============
None
Testing
=======
* Unit and functional (API samples) tests as normal.
* Since the `createImage` and `createBackup` APIs currently do not return a
response body there is not actually an existing response schema validation
check in Tempest, so one would have to be added.
Documentation Impact
====================
The `createImage` and `createBackup` API reference documentation will be
updated.
References
==========
This originally came up as a bug: https://bugs.launchpad.net/nova/+bug/1679285
.. [1] https://github.com/openstack/tempest/blob/15.0.0/tempest/api/compute/images/test_images_oneserver.py#L94
.. [2] https://github.com/openstack/python-novaclient/blob/7.1.0/novaclient/v2/servers.py#L1613
History
=======
.. list-table:: Revisions
:header-rows: 1
* - Release Name
- Description
* - Pike
- Introduced