Files
nova-specs/specs/pike/implemented/custom-resource-classes-in-flavors.rst
Matt Riedemann 19c0689fa3 Move pike implemented specs
This is generated using:

  $ tox -e move-implemented-specs -- pike -v

Change-Id: I4f3e159430dbe7146e98f93645d8f6be06acb097
2017-09-03 10:34:10 -04:00

216 lines
7.0 KiB
ReStructuredText

..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
===================================================
Allow custom resource classes in flavor extra specs
===================================================
https://blueprints.launchpad.net/nova/+spec/custom-resource-classes-in-flavors
This spec proposes the ability to create flavors that can select custom
resource classes at scheduling time, and override standard resource classes
to avoid scheduling them, while maintaining a useful display of the flavor.
Problem description
===================
The background to this problem is well described in the custom resource
classes [1]_ spec.
With that spec implemented, we now are able to represent these units of
consumable resources, but not schedule to them. The scheduler currently only
requests units of VCPU, MEMORY_MB, and DISK_GB. It needs to be able to request
custom resource classes as well, to be able to properly filter these resources.
Since the end goal is to be able to schedule only based on the custom resource
class, but flavor display and users rely on VCPU, MEMORY_MB, and DISK_GB, we
will also need to add overrides for these resource classes. These overrides
will allow dashboards, CLIs, etc. to be able to display the resources available
for these flavors, without requiring the scheduler to filter on them.
Use Cases
---------
As a deployer of ironic, I wish to be able to create flavors which request
a specific class of indivisible baremetal machines. I also want my users
to be able to see what sort of CPU/RAM/disk resources are available on my
baremetal flavors, without scheduling on that data.
As an NFV deployer, I have hardware that has FPGA devices. I have tagged that
hardware in the placement engine with custom resource classes based on the
software loaded into the FPGA. I would like to allow my users to select a
flavor that targets their instance to a machine with an FPGA that has
particular software loaded.
Proposed change
===============
We propose to add handling for a number of flavor extra specs to solve this:
* ``resources:$CUSTOM_RESOURCE_CLASS=$N``, where $N is a positive integer
value. This will be added to the request made by the ``FilterScheduler`` to
the placement engine, to filter scheduling candidates by the custom resource
class if present.
* ``resources:$STANDARD_RESOURCE_CLASS=0``, where $STANDARD_RESOURCE_CLASS is
one of "VCPU", "MEMORY_MB", or "DISK_GB". This causes the scheduler to avoid
scheduling based on the associated value in the top level Flavor object
field, while still using it for flavor display.
When the scheduler is constructing the request to placement, it will start by
building a list of resource classes from the base flavor attributes as it does
today. Next it will look for any overrides and add classes and/or adjust
amounts of existing classes based on the extra_specs it finds.
Existing ironic instances will need to go through a migration (described in the
"Data model impact" section) in order to correct allocations if the node has
a resource class defined.
Alternatives
------------
We could instead add new field(s) to the Flavor object that are specifically
meant for custom resource classes and overrides of standard resource classes.
While this does have the benefit of avoiding an off chance that some operator
is already using extra specs like this, there's a couple of reasons not to do
this. First, it creates an extra cycle before we can require ironic operators
to transition their flavors, because the new field wouldn't be available until
Pike. Second, as I understand things, we want to avoid adding to flavors right
now, as it makes it more work to get rid of them altogether in the long term.
Data model impact
-----------------
Existing ironic instances won't have the custom resource class recorded in
their ``instance.flavor`` attribute. As such, allocations won't be recorded for
this resource class, and the node the instance exists on will be schedulable
with new-style flavors.
For example, let's say an existing ironic instance has a resource_class of
``CUSTOM_BAREMETAL_GOLD`` which is accounted for in the baremetal service, but
is not reported as an allocation against the resource provider in the
placement service. If an operator configures a flavor's extra_specs and sets
``resources:CUSTOM_BAREMETAL_GOLD="1"``, the scheduler may pick a node to host
the instance that placement thinks is available, as there are no allocations
against it, but the resource is actually already consumed. This would result in
a build failure.
To resolve this, we need to do two things:
1. We'll need to check each existing instance at Pike startup, in the driver
layer. If the ironic node that the instance exists on has a resource class
defined, we add the custom resource class to ``instance.flavor``.
2. When updating instance allocations in the ``update_available_resource``
periodic task in the nova-compute service, the scheduler report client will
need to check for custom resource classes on the ``instance.flavor`` and
report those into the placement service.
REST API impact
---------------
None.
Security impact
---------------
None.
Notifications impact
--------------------
None.
Other end user impact
---------------------
None.
Performance Impact
------------------
Due to the migrations, there will be a small performance penalty to start
nova-compute hosts running the ironic driver for the first time in Pike.
Other deployer impact
---------------------
Deployers will need to adjust their flavors to use custom resource classes,
before upgrading to Queens.
.. warning:: Deployers should not adjust their flavors until the data migration
described in the `Data model impact`_ section above is complete.
Developer impact
----------------
None.
Implementation
==============
Assignee(s)
-----------
Primary assignee:
Ed Leafe (edleafe)
Other contributors:
Jay Pipes (jaypipes)
Work Items
----------
* Add code to migrate ironic instance flavor data.
* Add code to report custom resource class allocations.
* Add support for custom resource classes in the scheduler request.
* Add overrides for standard resource classes (the deployer does this).
Dependencies
============
This change depends on the resource tracker reporting custom resource class
inventory, which is tracked in the "Custom Resource Classes (Pike)"
blueprint. [2]_
Testing
=======
New style flavors will be added to setup for the job that runs ironic and
nova with resource classes on the nodes.
Documentation Impact
====================
These extra specs should be documented in the Install Guide, and also in
the Upgrades guide.
References
==========
.. [1] http://specs.openstack.org/openstack/nova-specs/specs/ocata/approved/custom-resource-classes.html
.. [2] https://blueprints.launchpad.net/nova/+spec/custom-resource-classes-pike
History
=======
.. list-table:: Revisions
:header-rows: 1
* - Release Name
- Description
* - Pike
- Introduced