Add trait support in the allocation candidates API
Proposals to add traits support in the `GET /allocation_candidates` API. Related to blueprint add-trait-support-in-allocation-candidates Change-Id: I0af8cf07903242d55aae4fe922e00837d63c24e7
This commit is contained in:
@@ -0,0 +1,240 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
Support Traits in Allocation Candidates
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/nova/+spec/add-trait-support-in-allocation-candidates
|
||||||
|
|
||||||
|
The placement API already supports filtering resource providers that have
|
||||||
|
capacity for a requested amount of resources. In addition to those quantitative
|
||||||
|
aspects of the request, the placement API also needs to filter out resource
|
||||||
|
providers that do not have a set of required qualitative attributes.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
The `GET /allocation_candidates` only supports querying by quantitative aspect
|
||||||
|
with `resources` query parameters. For the qualitative aspect, we need an
|
||||||
|
additional parameter, `required`.
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
---------
|
||||||
|
|
||||||
|
This is an API proposal for the internal interaction between Nova and
|
||||||
|
Placement. The final use-case is the end user wants to boot up instance on the
|
||||||
|
compute node which has AVX cpu feature, the compute node doesn't have AVX cpu
|
||||||
|
feature will be filtered out even though they have the capacity.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
Proposes to add `required` query parameter to the `GET /allocation_candidates`
|
||||||
|
API. It will accept a list of traits, and the API will return a set of
|
||||||
|
allocation requests, the resource providers in those allocation request have
|
||||||
|
each of the traits in the parameter `required`.
|
||||||
|
|
||||||
|
With nested resource providers, traits defined on a parent RP are assumed to
|
||||||
|
belong to all its child (descendant) RPs. However, traits defined on a child
|
||||||
|
RP do not apply to the parent (ancestor) RPs. There is no implied sharing of
|
||||||
|
traits within aggregates.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
There also a proposal about `preferred_traits` parameter, it means nice to
|
||||||
|
have a list of traits. But there still haven't clear use-case for it, so it
|
||||||
|
isn't in the proposal.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Proposals to add `required` parameter to the `GET /allocation_candidates`. It
|
||||||
|
accepts a list of traits separated by `,`. For example::
|
||||||
|
|
||||||
|
GET /allocation_candidates?resources=VCPU:8,MEMORY_MB:1024,DISK_GB:4096&required=HW_CPU_X86_AVX,STORAGE_DISK_SSD
|
||||||
|
|
||||||
|
In the above request, the traits `HW_CPU_X86_AVX` and `STORAGE_DISK_SSD` are
|
||||||
|
required.
|
||||||
|
|
||||||
|
The validation for the `required` are:
|
||||||
|
|
||||||
|
* The `required` is optional, but `resources` is required parameter. So the
|
||||||
|
`required` should be specified with specifiying `resources`.
|
||||||
|
* Any invalid traits in the `required` parameters will result in a
|
||||||
|
`HTTPBadRequest 400`. Invalid trait means the trait isn't in the `os-traits`
|
||||||
|
library and also isn't a custom trait defined by traits API.
|
||||||
|
* An empty value in `required` is not acceptable and will also result in a
|
||||||
|
`HTTPBadRequest 400`.
|
||||||
|
|
||||||
|
The API will return a set of allocation requests, each allocation request is
|
||||||
|
a combination of root resource provider, nested resource providers and shared
|
||||||
|
resource providers. The required traits may spread in those resource providers.
|
||||||
|
|
||||||
|
For example, the compute node resource provider might have the `HW_CPU_X86_AVX`
|
||||||
|
trait but not the `STORAGE_DISK_SSD` trait. That trait may be associated with
|
||||||
|
the shared storage provider that is providing the DISK_GB resources for the
|
||||||
|
request. For the above request, the API will return an allocation request
|
||||||
|
which includes two resource providers, compute node resource provider provides
|
||||||
|
`VCPU` and `MEMORY_MB` resources with trait `HW_CPU_X86_AVX`, the shared
|
||||||
|
storage provider are sharing `DISK_GB` resource with trait `STORAGE_DISK_GB`.
|
||||||
|
|
||||||
|
All traits which the resource provider have will be included in the provider
|
||||||
|
summary of the responses::
|
||||||
|
|
||||||
|
{
|
||||||
|
"allocation_requests": [
|
||||||
|
{
|
||||||
|
"allocations": [
|
||||||
|
{
|
||||||
|
"resource_provider": {
|
||||||
|
"uuid": "88a5187d-e0a4-426d-bed4-54e7e89b2adb"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"VCPU": 8,
|
||||||
|
"MEMORY_MB": 1024,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"resource_provider": {
|
||||||
|
"uuid": "0d684632-eca3-40a9-ab6b-b7457227143c"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"DISK_GB": 4096
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"provider_summaries": {
|
||||||
|
"88a5187d-e0a4-426d-bed4-54e7e89b2adb": {
|
||||||
|
"resources": {
|
||||||
|
"VCPU": {
|
||||||
|
"capacity": 128,
|
||||||
|
"used": 1
|
||||||
|
}
|
||||||
|
"MEMORY_MB": {
|
||||||
|
"capacity": 8096,
|
||||||
|
"used": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"traits": [
|
||||||
|
"HW_CPU_X86_SSE",
|
||||||
|
"HW_CPU_X86_SSE2",
|
||||||
|
"HW_CPU_X86_AVX",
|
||||||
|
"HW_CPU_X86_AVX2",
|
||||||
|
...
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0d684632-eca3-40a9-ab6b-b7457227143c": {
|
||||||
|
"resources": {
|
||||||
|
"DISK_GB": {
|
||||||
|
"capacity": 40960,
|
||||||
|
"used": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"traits": [
|
||||||
|
"STORAGE_DISK_SSD"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
When there are no traits for a resource provider, the `traits` attribute is
|
||||||
|
still in the response, and with a empty list.
|
||||||
|
|
||||||
|
All the above change are in a new microversion.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
In the implementation, there will be a separate SQL to query the resource
|
||||||
|
providers which have required traits. Then filter those resource providers
|
||||||
|
in the main SQL. It will be slower than single SQL, but it is acceptable.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
Alex Xu <hejie.xu@intel.com>
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
Lei Zhang <lei.a.zhang@intel.com>
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Add a common method to query the resource providers which have required
|
||||||
|
traits.
|
||||||
|
* Integrate the common query method into the main query.
|
||||||
|
* Fill the traits into the ProviderSummaries object.
|
||||||
|
* Expose the `required` parameter in the `GET /allocation_candidates` API with
|
||||||
|
a new microversion.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
DB and API functional tests are required.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
The placement API reference should be updated with the new parameters.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. list-table:: Revisions
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Release Name
|
||||||
|
- Description
|
||||||
|
* - Queens
|
||||||
|
- Introduced
|
||||||
Reference in New Issue
Block a user