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:
Jay Pipes
2014-10-10 14:13:24 -04:00
committed by Joe Gordon
parent c7c16f33a5
commit ce03343c2b

View File

@@ -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.