Add host and hypervisor_hostname flag to create server
APIImpact Change-Id: I0a543214b975110bb323db48857d13818c299908 Blueprint: add-host-and-hypervisor-hostname-flag-to-create-server
This commit is contained in:
@@ -0,0 +1,233 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
======================================================
|
||||
Add host and hypervisor hostname flag to create server
|
||||
======================================================
|
||||
|
||||
https://blueprints.launchpad.net/nova/+spec/add-host-and-hypervisor-hostname-flag-to-create-server
|
||||
|
||||
When admin users specify the `forced_host/forced_node`_ to create servers,
|
||||
nova will bypass the scheduler filters. This spec proposes to add two new
|
||||
params ``host`` and ``hypervisor_hostname`` as specified host and/or node to
|
||||
create servers without bypassing the scheduler filters in a new REST API
|
||||
microversion.
|
||||
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
When admin users specify the `forced_host/forced_node`_ to create servers,
|
||||
nova will bypass the scheduler filters.
|
||||
|
||||
* Without scheduler filters, failure instances may waste effort trying to boot
|
||||
when failure is inevitable because of network provider, PCI device, NUMA
|
||||
topology, etc.
|
||||
* We could be trying to claim resources on the host that aren't available,
|
||||
and/or unintentionally over-subscribing the host because without running
|
||||
the filters we don't pass down any limits for the resource claim.
|
||||
|
||||
Use Cases
|
||||
---------
|
||||
|
||||
This change adds the following use case to the system:
|
||||
|
||||
* An admin wants to request that a server is created on a specified compute
|
||||
host and/or node and have the request validated by the scheduler filters
|
||||
rather than forced.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
* Add ``host`` and ``hypervisor_hostname`` to the REST API ``POST /servers``.
|
||||
* Add a new policy ``os_compute_api:servers:create:requested_destination`` to
|
||||
limit ``host`` and ``hypervisor_hostname`` only for admin.
|
||||
* Translate ``host`` and ``hypervisor_hostname`` to a
|
||||
RequestSpec.requested_destination which still goes through the scheduler
|
||||
filters.
|
||||
|
||||
.. note::
|
||||
|
||||
We still leave the old mechanism ``az:host:node`` in this new microversion
|
||||
so users have the option of either forcing the target during server creates
|
||||
or requesting the target.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
There is a filter named `JsonFilter`_ which is not used by default. This
|
||||
filter allows simple JSON-based grammar for selecting hosts. If we want to
|
||||
specify the host named "openstack-node", we can add the params like this:
|
||||
``--hint query='["=","$host","openstack-node"]'``.
|
||||
|
||||
In addition to the warnings in the documentation for this filter, if it is
|
||||
configurable, it may not be present in all clouds and thus can not be
|
||||
guaranteed for interoperability.
|
||||
|
||||
There is a filter named `AggregateInstanceExtraSpecsFilter`_ which is not used
|
||||
by default. This filter checks that the aggregate metadata satisfies any extra
|
||||
specifications associated with the instance type (that have no scope or are
|
||||
scoped with ``aggregate_instance_extra_specs``). If we want to specify the
|
||||
host named "openstack-node", we can create a aggregate named "test-ag01"
|
||||
include host "openstack-node". Then we set metadata for this aggregate with
|
||||
``host=openstack-node``. At last, we create a flavor and set metadata for
|
||||
this flavor with ``aggregate_instance_extra_specs:host=openstack-node``. So
|
||||
when we choose the flavor to create instances, all will be on the host
|
||||
"openstack-node".
|
||||
|
||||
In this case, creating an aggregate and flavor pinned to that aggregate for
|
||||
every host/node in a large cloud is not manageable and would also potentially
|
||||
leak deployment details about the cloud, and also confuse users when we have
|
||||
so many availability zones to model those aggregates. It's just not a
|
||||
realistic option for this use case in a large cloud.
|
||||
|
||||
.. _JsonFilter: https://docs.openstack.org/nova/latest/admin/configuration/schedulers.html#jsonfilter
|
||||
.. _AggregateInstanceExtraSpecsFilter: https://docs.openstack.org/nova/latest/admin/configuration/schedulers.html#aggregateinstanceextraspecsfilter
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
In a new microversion add the ``host`` and ``hypervisor_hostname`` flag
|
||||
to the API, both of them are optional:
|
||||
|
||||
* POST /servers
|
||||
|
||||
::
|
||||
|
||||
{
|
||||
"server": {
|
||||
...
|
||||
"host": "openstack-node",
|
||||
"hypervisor_hostname": "openstack-node"
|
||||
}
|
||||
}
|
||||
|
||||
Only show new parameters' JSON schema definition for body data of ``server``:
|
||||
|
||||
::
|
||||
|
||||
'host': parameter_types.hostname
|
||||
'hypervisor_hostname': parameter_types.hostname
|
||||
|
||||
Depending on whether/how the ``host`` and ``hypervisor_hostname`` is set,
|
||||
the actions are as followed:
|
||||
|
||||
- If ``host`` is supplied in the request body, at first Compute API will check
|
||||
whether we can fetch a compute node for this ``host`` from DB. If not, an
|
||||
``HTTP 400 Bad Request`` will be returned to users.
|
||||
|
||||
- If ``hypervisor_hostname`` is supplied in the request body, at first
|
||||
Compute API will check whether we can fetch a compute node for this
|
||||
``hypervisor_hostname`` from DB. If not, an ``HTTP 400 Bad Request`` will
|
||||
be returned to users.
|
||||
|
||||
- If both ``host`` and ``hypervisor_hostname`` are supplied in the request
|
||||
body, at first Compute API will check whether we can fetch a compute node
|
||||
for ``host`` and ``hypervisor_hostname`` from DB. If not, an
|
||||
``HTTP 400 Bad Request`` will be returned to users.
|
||||
|
||||
.. note::
|
||||
|
||||
The new (``host`` and/or ``hypervisor_hostname``) and the old
|
||||
(``az:host:node``) mechanisms are mutually exclusive. If both are specified
|
||||
in the same request, the API will return an HTTP 400 Bad Request.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
Update python-novaclient and python-openstackclient to support the new
|
||||
microversion.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None
|
||||
|
||||
Upgrade impact
|
||||
--------------
|
||||
|
||||
None
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
|
||||
Primary assignee:
|
||||
Boxiang Zhu (zhu.boxiang@99cloud.net)
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Add new microversion for this change.
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
||||
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
* Functional and unit test will be provided.
|
||||
* Some scenarios (Create a server on a requested host and/or node and then
|
||||
move it - live migrate, evacuate, cold migrate and unshelve - to make sure
|
||||
it moves to another host and isn't restricted to the original requested
|
||||
destination) will be provided.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
* The API document should be changed to introduce this new feature.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
.. _forced_host/forced_node: https://docs.openstack.org/nova/latest/admin/availability-zones.html
|
||||
|
||||
* Train PTG etherpad: https://etherpad.openstack.org/p/nova-ptg-train
|
||||
|
||||
|
||||
History
|
||||
=======
|
||||
|
||||
.. list-table:: Revisions
|
||||
:header-rows: 1
|
||||
|
||||
* - Release Name
|
||||
- Description
|
||||
* - Train
|
||||
- Introduced
|
Reference in New Issue
Block a user