Files
nova-specs/specs/queens/implemented/post-allocations.rst
Matt Riedemann f350472e62 Move queens implemented specs
This moves the completed queens specs to the implemented
directory, adds the redirects and also removes the queens-template
symlink from the approved directory and docs.

This was done using:

  $ tox -e move-implemented-specs -- queens

Change-Id: I9e4d9aec4a1ced181ef7850627b9c67de376beae
2018-02-08 19:27:32 -05:00

242 lines
7.3 KiB
ReStructuredText

..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
=========================
POST Multiple Allocations
=========================
https://blueprints.launchpad.net/nova/+spec/post-allocations
With `migration allocations`_ we plan to have the resources claimed by a
move-like operation represented by two allocations to the placement service:
one identified by the instance uuid, the other by a migration uuid. This can
currently be done by making two separate ``PUT`` requests to
``/allocations/{consumer_uuid}`` in the `Placement API`_. This can work, but
has risks as a race condition and requires two steps where logically we want
the caller to be thinking in terms of one.
Problem description
===================
One the main goals of the Placement service has been to more accurately
represent the true use of resources in the cloud and use that increased
accuracy to avoid making promises (e.g., "yes we have the resources to do this
move") that we then can't keep because something changes after the promise has
been made but before the action has been completed.
If, in the case of move operations, we attempt to make allocations in two steps
we have situations where there is a window of time (admittedly usually short,
but latency is unpredictable) where Placement's representation of reality is
not what we want it to be. If resources are scarce something else can claim
them in the gap.
In the case of a move we want, for example, to:
* change an instance claim into a migration claim by removing the instance
claim and creating the migration claim in one request
* create the instance claim on the new destination
* if the build succeeds remove the migration claim
That first step is where we need the solution described in this document.
Use Cases
---------
As an end user or an operator I want to have reliable move operations that make
the most efficient use of resources.
Proposed change
===============
To address this requirement a new handler will be created in the `Placement
API`_ at ``POST /allocations`` which will accept a collection of allocation
requests for multiple consumers and save all of them in a single transaction,
or fail all of them if resources are not available or the allocation requests
are malformed.
Details of the various options for the request body are discussed in
:ref:`rest-api` below.
Alternatives
------------
An open question on how to implement this is related to the existing bug
about `asymmetric PUT and GET`_ for ``/allocations/{consumer_uuid}``. We can
consider either a dict or list-based representation for ``POST``. See
:ref:`rest-api` below for examples.
There aren't really any reasonable alternatives to ``POST /allocations`` for
this use case. ``PUT`` to the same URI violates HTTP semantics. That would mean
"replace all the allocations on the system with what I've provided". Using a
different URI is hard to contemplate: ``PUT
/allocations/{consumer_uuid},{migration_uuid},{some_uuid}``. No thank you.
Data model impact
-----------------
The existing database tables are adequate. The ``project_id`` and ``user_id``
attributes currently associated with the `AllocationList`` object need to be
moved to the `Allocation` object to ensure that a collection of allocations
from multiple logical users can be handled correctly.
.. _rest-api:
REST API impact
---------------
A new handler at ``POST /allocations`` will be created, accepting an
``application/json`` body. Upon success it will return a ``204`` status code
and an empty body. Error conditions include:
* 400 Bad Request: When the JSON body does not match schema
* 400 Bad Request: When a resource provider or resource class named in the body
does not exist.
* 409 Conflict: When at least one of the allocations will violate Inventory
constraints or available capacity.
* 409 Conflict: When, during the allocation process there is a resource
provider generation mismatch (if this happens the client should
retry). This 409 is distinguished from the previous by the
error text in the body.
.. highlight:: javascript
The format of the body will be as follows, based on resolving the
`asymmetric PUT and GET`_ bug to align on a dict-like format::
{
"$INSTANCE-UUID": {
"allocations": {
"$TARGET_UUID": {
"resources": {
"MEMORY_MB": 1024,
"VCPU": 2
}
},
"$SHARED_DISK": {
"resources": {
"DISK_GB": 5
}
}
},
project_id: "$PROJECT_ID",
user_id: "$USER_ID"
},
"$MIGRATION_UUID": {
"allocations": {
"$SOURCE_UUID" {
"MEMORY_MB": 1024,
"VCPU": 2
}
},
project_id: "$PROJECT_ID",
user_id: "$USER_ID"
}
}
``$INSTANCE_UUID`` and ``$MIGRATION_UUID`` are consumer uuids. If no
allocations exist on the server for a consumer they will be created using
values in the body of the ``allocations`` key. If allocations already exist,
they will be replaced. An empty value for the ``allocations`` key will mean
that the allocations for that consumer will be removed.
Security impact
---------------
None.
Notifications impact
--------------------
None.
Other end user impact
---------------------
If the osc-placement plugin becomes a thing, this functionality will need to be
added there.
Performance Impact
------------------
None expected.
Other deployer impact
---------------------
None.
Developer impact
----------------
Scheduler Report Client will need to be aware of the new URI and microversion
in order to take advantage of the functionality. Users of that client, such as
the compute manager will need to be updated.
Implementation
==============
Assignee(s)
-----------
Primary assignee:
cdent
Other contributors:
dansmith
Work Items
----------
* Write JSONschema for the new body representation
* Add URI and handler to Placement
* Integrate with AllocationList object
* Add gabbi tests for the new microversion
* Add document of the URI to placement-api-ref
Dependencies
============
* Related to `migration allocations`_
Testing
=======
Gabbi tests will be able to cover most of the scenarios for how data will be
passed over the API. What will matter more is one the report client is using
this code making sure that functional tests are verifying the allocations end
up correct. A lot of these tests are already in place, so that's nice.
Documentation Impact
====================
placement-api-ref will need to be updated to explain the new URI.
References
==========
* `Placement API`_
* `Proof of Concept`_
History
=======
.. list-table:: Revisions
:header-rows: 1
* - Release Name
- Description
* - Queens
- Introduced
.. _migration allocations: https://blueprints.launchpad.net/nova/+spec/migration-allocations
.. _Placement API: https://developer.openstack.org/api-ref/placement/
.. _asymmetric PUT and GET: https://bugs.launchpad.net/nova/+bug/1708204
.. _Proof of Concept: https://review.openstack.org/#/c/500073/