Change select_destinations() to use request spec
Specification to change the `select_destinations()` scheduler RPC API method to use a `nova.objects.request_spec.RequestSpec` object instead of a nested dict. Co-Authored-By: Sylvain Bauza <sbauza@redhat.com> Change-Id: I9f9a5d48b1203c619b2e9033a9b65934811c996f Blueprint: sched-select-destinations-use-request-spec-object
This commit is contained in:
@@ -0,0 +1,209 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
=========================================================================
|
||||||
|
select_destinations() scheduler RPC API method to pass RequestSpec object
|
||||||
|
=========================================================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/nova/+spec/sched-select-destinations-use-request-spec-object
|
||||||
|
|
||||||
|
Change the `select_destinations()` scheduler RPC API method to use a
|
||||||
|
`nova.objects.request_spec.RequestSpec` object instead of a nested dict.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
The main interface into the scheduler, the `select_destinations()` method,
|
||||||
|
accepts a `request_spec` parameter and a filter_properties parameter that are
|
||||||
|
nested dict.
|
||||||
|
The nested `request_spec` dict is constructed in
|
||||||
|
`nova.scheduler.utils.build_request_spec()`, which is called by nova-conductor
|
||||||
|
before asking the scheduler to find compute nodes on which to put one or more
|
||||||
|
requested virtual machine instances.
|
||||||
|
The nested `filter_properties` dict is mainly built in the
|
||||||
|
`nova.compute.api._build_filter_properties()` method, which is called before
|
||||||
|
asking the scheduler to find compute nodes, but can also be built in other
|
||||||
|
places and needs consistency.
|
||||||
|
|
||||||
|
Previous blueprints have introduced a `nova.objects.request_spec.RequestSpec`
|
||||||
|
object that can model the entire request for multiple instance launches.
|
||||||
|
However, the scheduler RPC API has not been changed to use this new object.
|
||||||
|
Instead, nova-scheduler constructs the `RequestSpec` object in its
|
||||||
|
`_schedule()` method, populating the request spec attributes manually by
|
||||||
|
looking at the `request_spec` dictionary parameter.
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
----------
|
||||||
|
|
||||||
|
This is a pure refactoring effort for cleaning up all the interfaces in between
|
||||||
|
Nova and the scheduler so the scheduler could be split out by the next cycle.
|
||||||
|
|
||||||
|
Project Priority
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
This blueprint is part of a global effort around the 'scheduler' refactoring
|
||||||
|
for helping it to be split out. This has been defined as the 3rd priority for
|
||||||
|
this Kilo cycle.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
The RequestSpec object will be amended to add the filter_properties fields.
|
||||||
|
The `select_destinations()` scheduler RPC API method will be changed to consume
|
||||||
|
a `nova.objects.request_spec.RequestSpec` object instead of two nested
|
||||||
|
dictionaries. The RPC API will be incremented and translation code blocks will
|
||||||
|
be added to allow older nova-conductor workers to continue to transmit the
|
||||||
|
dictionary `request_spec` and `filter_properties` parameters.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None, besides making the scheduler call interfaces gradually easier to read
|
||||||
|
and understand.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
We will increment the version of the RequestSpec object by adding new fields
|
||||||
|
which were previously provided in the `filter_properties` dictionary. The new
|
||||||
|
RequestSpec object should look like :
|
||||||
|
|
||||||
|
.. code:: python
|
||||||
|
|
||||||
|
class RequestSpec(base.NovaObject):
|
||||||
|
|
||||||
|
"""Models the request to launch one or more instances in the cloud."""
|
||||||
|
|
||||||
|
VERSION = '1.1'
|
||||||
|
|
||||||
|
fields = {
|
||||||
|
'image': fields.DictOfStringsField(nullable=False),
|
||||||
|
# This should eventually be deconstructed into component parts
|
||||||
|
'instance_properties': fields.ObjectField('Instance'),
|
||||||
|
'instance_type': fields.ObjectField('Flavor', nullable=True),
|
||||||
|
'num_instances': fields.IntegerField(nullable=False, default=1),
|
||||||
|
'force_hosts': fields.StringField(nullable=True),
|
||||||
|
'force_nodes': fields.StringField(nullable=True),
|
||||||
|
'pci_requests': fields.ListOfObjectsField('PCIRequest', nullable=True),
|
||||||
|
'retry': fields.ObjectField('Retry', nullable=True),
|
||||||
|
'limits': fields.ObjectField('Limits', nullable=True),
|
||||||
|
'group': fields.ObjectField('GroupInfo', nullable=True),
|
||||||
|
'scheduler_hints': fields.DictOfStringsField(nullable=True)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PCIRequest, Retry, Limits and GroupInfo objects will be created accordingly.
|
||||||
|
|
||||||
|
We will increment the version of the scheduler RPC API and insert translation
|
||||||
|
blocks in the `select_destinations` method to handle an older nova-conductor
|
||||||
|
node sending the old-style dictionaries `request_spec` and `filter_properties`
|
||||||
|
parameters to a newer nova-scheduler node that expects a `RequestSpec` object.
|
||||||
|
|
||||||
|
The nova-conductor manager code will then be updated to construct a
|
||||||
|
`RequestSpec` object to pass to the `select_destinations()` scheduler RPC API
|
||||||
|
instead of calling `nova.scheduler.utils.build_request_spec()`. The
|
||||||
|
`build_request_spec()` method will then be removed.
|
||||||
|
|
||||||
|
All calls made for updating filter_properties dictionary will be replaced by
|
||||||
|
setting fields to the RequestSpec object attached.
|
||||||
|
|
||||||
|
The code added in the `request-spec-objects` blueprint that constructed a
|
||||||
|
`RequestSpec` object in the `FilterScheduler._schedule()` method will then be
|
||||||
|
removed, as it will no longer be needed since the `request_spec` parameter will
|
||||||
|
already be an object.
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
bauzas
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
- Increment RequestSpec object by adding new fields related to
|
||||||
|
`filter_properties`
|
||||||
|
|
||||||
|
- Increment the scheduler RPC API `select_destinations()` method to take a
|
||||||
|
`RequestSpec` object instead of a dictionary for the `request_spec`
|
||||||
|
parameter. In the same patch, modify the conductor manager to construct a
|
||||||
|
`RequestSpec` object and pass that to `select_destinations()` instead of
|
||||||
|
dict. Remove the code in filter_scheduler.FilterScheduler._schedule() that
|
||||||
|
constructs a `RequestSpec` object, since the object is now being passed to
|
||||||
|
`select_destinations()`
|
||||||
|
|
||||||
|
- Remove the `nova.scheduler.utils.build_request_spec` function.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
This blueprint is dependent on the completion of the following blueprints:
|
||||||
|
|
||||||
|
- `request-spec-object`
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
New unit tests for the request spec objects will be added. The existing unit
|
||||||
|
tests of the scheduler will be overhauled in the patch set that converts the
|
||||||
|
filters to use the new request_spec object model instead of its current
|
||||||
|
free-form `filter_properties` dictionary of things.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
Developer reference material that explains the new placement spec class
|
||||||
|
will be delivered as a part of this blueprint.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
This blueprint is part of an overall effort to clean up, version, and stabilize
|
||||||
|
the interfaces between the nova-api, nova-scheduler, nova-conductor and
|
||||||
|
nova-compute daemons that involve scheduling and resource decisions.
|
||||||
|
|
||||||
|
See https://wiki.openstack.org/wiki/Gantt/kilo#Tasks for the list of all
|
||||||
|
blueprints targeted for Kilo.
|
||||||
Reference in New Issue
Block a user