Spec: allocation candidates in tree
This patch proposes a spec to support for filtering allocation candidates by provider tree. Change-Id: I5f403af2e8c98e0804d29ec36dbe4465961b2d83 Blueprint: alloc-candidates-in-tree
This commit is contained in:
parent
d4be64cfab
commit
8ba67f6966
207
specs/stein/approved/alloc-candidates-in-tree.rst
Normal file
207
specs/stein/approved/alloc-candidates-in-tree.rst
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
=============================================
|
||||||
|
Filter Allocation Candidates by Provider Tree
|
||||||
|
=============================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/nova/+spec/alloc-candidates-in-tree
|
||||||
|
|
||||||
|
This blueprint proposes to support for filtering allocation candidates
|
||||||
|
by provider tree.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Placement currently supports ``in_tree`` query parameters for the
|
||||||
|
``GET /resource_providers`` endpoints. This parameter is a string representing
|
||||||
|
a resource provider uuid, and when this is present, the response is limited to
|
||||||
|
resource providers within the same tree of the provider indicated by the uuid.
|
||||||
|
See `Nested Resource Providers`_ spec for details.
|
||||||
|
|
||||||
|
However, ``GET /allocation_candidates`` doesn't support the ``in_tree`` query
|
||||||
|
parameter to filter the allocation candidates by resource tree. This results
|
||||||
|
in inefficient post-processing in some cases where the caller has already
|
||||||
|
selected the resource provider tree before calling that API.
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
---------
|
||||||
|
|
||||||
|
This feature is useful when the caller of the ``GET /allocation_candidates``
|
||||||
|
has already picked up resource providers they want to use.
|
||||||
|
|
||||||
|
As described in the `Bug#1777591`_, when an admin operator creates an instance
|
||||||
|
on a specific host, nova now explicitly sets no limitation for getting
|
||||||
|
allocation candidates to prevent placement from filtering out the
|
||||||
|
pre-determined target resource provider by the random limitation. (For the
|
||||||
|
limitation feature of the API, see the `Limiting Allocation Candidates`_
|
||||||
|
spec)
|
||||||
|
|
||||||
|
Instead of issuing the inefficient request to placement, we can use ``in_tree``
|
||||||
|
query with the pre-determined target host resource provider uuid calling the
|
||||||
|
``GET /allocation_candidates`` API.
|
||||||
|
|
||||||
|
We would solve the same problem for cases of live migration to a specified
|
||||||
|
host and rebuilding an instance on the same host.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
The ``GET /allocation_candidates`` call will accept a new query parameter
|
||||||
|
``in_tree``. This parameter is a string representing a resource provider uuid.
|
||||||
|
When this is present, the response of the allocation candidates is limited to
|
||||||
|
only allocation requests where at least one resource provider in the specified
|
||||||
|
tree is involved.
|
||||||
|
|
||||||
|
In the following environments,
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
+-----------------------+
|
||||||
|
| sharing storage (ss1) |
|
||||||
|
| DISK_GB: 1000 |
|
||||||
|
+-----------+-----------+
|
||||||
|
| Shared via an aggregate
|
||||||
|
+-----------------+----------------+
|
||||||
|
+--------------|---------------+ +--------------|--------------+
|
||||||
|
| +------------+-------------+ | | +------------+------------+ |
|
||||||
|
| | compute node (cn1) | | | |compute node (cn2) | |
|
||||||
|
| | DISK_GB: 1000 | | | | DISK_GB: 1000 | |
|
||||||
|
| +-----+-------------+------+ | | +----+-------------+------+ |
|
||||||
|
| | nested | nested | | | nested | nested |
|
||||||
|
| +-----+------+ +----+------+ | | +----+------+ +----+------+ |
|
||||||
|
| | numa1_1 | | numa1_2 | | | | numa2_1 | | numa2_2 | |
|
||||||
|
| | VCPU: 4 | | VCPU: 4 | | | | VCPU: 4 | | VCPU: 4 | |
|
||||||
|
| +------------+ +-----------+ | | +-----------+ +-----------+ |
|
||||||
|
+------------------------------+ +-----------------------------+
|
||||||
|
|
||||||
|
for example::
|
||||||
|
|
||||||
|
GET /allocation_candidates?resources=VCPU:1,DISK_GB:50&in_tree={cn1_uuid}
|
||||||
|
|
||||||
|
would return 4 combinations of allocation candidates.
|
||||||
|
|
||||||
|
1. numa1_1 (VCPU) + cn1 (DISK_GB)
|
||||||
|
2. numa1_2 (VCPU) + cn1 (DISK_GB)
|
||||||
|
3. numa1_1 (VCPU) + ss1 (DISK_GB)
|
||||||
|
4. numa1_2 (VCPU) + ss1 (DISK_GB)
|
||||||
|
|
||||||
|
Note that candidates number 3 and 4 have "ss1", which is out of the specified
|
||||||
|
tree. They are not excluded because candidates number 3 and 4 have at least
|
||||||
|
one provider (numa1_1 and numa1_2 respectively) from the specified tree.
|
||||||
|
|
||||||
|
The specified tree can be a non-root provider::
|
||||||
|
|
||||||
|
GET /allocation_candidates?resources=VCPU:1,DISK_GB:50&in_tree={numa1_1_uuid}
|
||||||
|
|
||||||
|
would return the same result.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
We could have other query parameters like ``resource_provider_uuid`` or
|
||||||
|
``root_provider_uuid``, but ``in_tree`` would be consistent with the similar
|
||||||
|
``GET /resource_providers`` query parameter.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
A new microversion will be created to add the ``in_tree`` parameter to
|
||||||
|
``GET /allocation_candidates`` API.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
If the callers of the ``GET /allocation_candidates`` has already picked up
|
||||||
|
resource providers they want to use, they would get improved performance
|
||||||
|
using this new ``in_tree`` query because we don't need to get all the
|
||||||
|
candidates from the database.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
This feature enables us to develop efficient query in nova for cases that is
|
||||||
|
described in the `Use Cases`_ section.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Upgrade impact
|
||||||
|
--------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
Tetsuro Nakamura (nakamura.tetsuro@lab.ntt.co.jp)
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Update the ``AllocationCandidates.get_by_requests`` method to change the
|
||||||
|
database queries to filter on the specified provider tree.
|
||||||
|
* Update the placement API handlers for ``GET /allocation_candidates`` in
|
||||||
|
a new microversion to pass the new ``in_tree`` parameter to the methods
|
||||||
|
changed in the steps above, including input validation adjustments.
|
||||||
|
* Add functional tests of the modified database queries.
|
||||||
|
* Add gabbi tests that express the new queries, both successful queries and
|
||||||
|
those that should cause a 400 response.
|
||||||
|
* Release note for the API change.
|
||||||
|
* Update the microversion documents to indicate the new version.
|
||||||
|
* Update placement-api-ref to show the new query handling.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Normal functional and unit testing.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
Document the REST API microversion in the appropriate reference docs.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
* `Nested Resource Providers`_ spec
|
||||||
|
* `Bug#1777591`_ reported in the launchpad
|
||||||
|
* `Limiting Allocation Candidates`_ spec
|
||||||
|
|
||||||
|
.. _`Nested Resource Providers`: https://specs.openstack.org/openstack/nova-specs/specs/queens/approved/nested-resource-providers.html
|
||||||
|
.. _`Bug#1777591`: https://bugs.launchpad.net/nova/+bug/1777591
|
||||||
|
.. _`Limiting Allocation Candidates`: https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/allocation-candidates-limit.html
|
Loading…
Reference in New Issue
Block a user