ironic-specs/specs/kilo-implemented/root-device-hints.rst

210 lines
5.3 KiB
ReStructuredText

..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
=================
Root device hints
=================
https://blueprints.launchpad.net/ironic/+spec/root-device-hints
Allow operators to pass some hints to Ironic to decide which device
should be selected for the deployment.
Problem description
===================
When the deploy ramdisk boots Ironic picks the first disk it finds to
be the root device (the device where the image will be put on). If the
server has more than one SATA, SCSI or IDE disk controller, the order
in which their corresponding device nodes are added is arbitrary [`1`_]
[`2`_]. This may result in devices like /dev/sda and /dev/sdb switching
around on each boot and Ironic picking different disk every time the
machine is being deployed.
As an operator, if my server has multiple disks I would like to choose
which one Ironic should deploy the image onto. Or in case I have created
a RAID device to be my root device, I'd like to tell Ironic to always
use that.
Another problem, in case for the full disk image deployment, if we
deploy a server twice and on each deployment Ironic picks a different
disk we could end up with 2 disks containing a valid bootloader.
.. _`1`: https://wiki.archlinux.org/index.php/persistent_block_device_naming
.. _`2`: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Online_Storage_Reconfiguration_Guide/persistent_naming.html
Proposed change
===============
The change proposed by this blueprint is to give operators a means via
the Ironic API to pass some hints about what disk should be picked in
deploy time. That way Ironic can always pick the right disk to write
the image on.
Also, with the addition of Ironic being able to create RAID arrays,
it would be nice to be able to tell Ironic to use the device that was
just created to be the root device for the deployment.
This spec is proposing having a limited number of hints that could be
passed as part of the initial work, but could be extended later on. The
initial proposed hint list is:
* model (STRING): device identifier
* vendor (STRING): device vendor
* serial (STRING): disk serial number
* wwn (STRING): unique storage identifier
* hctl (STRING): Host:Channel:Target:Lun for SCSI
* size (INT): size of the device in GB
The hints should live in the `properties` attribute of the Node resource,
the key would be `root_device` and the value a dictionary so operators
could combine one or more hints. For example::
node.properties['root_device'] = {'wwn': '0x4000cca77fc4dba1'}
The logic about which disk will be picked will follow:
#. If the hints are not specified Ironic will continue to pick the
first disk it finds.
#. If hints are specified and only one disk is found Ironic will pick it.
#. If hints are specified and multiple disks are found Ironic will pick
the first disk that matches the all the criteria.
#. If hints are specified and no disks are found the deployment is aborted.
The default deploy ramdisk and `IPA`_ needs to be changed to support
filtering the disks based on the hints, if specified.
Alternatives
------------
We could recommend operators to avoid having multiple storage devices
on the machines being managed by Ironic.
Data model impact
-----------------
None
REST API impact
---------------
As we want to use a dictionary as a value on the `properties` attribute
the `bug 1398350`_ needs to be fixed.
RPC API impact
--------------
None
Driver API impact
-----------------
None
Nova driver impact
------------------
None
Security impact
---------------
None
Other end user impact
---------------------
None
Scalability impact
------------------
None
Performance Impact
------------------
None
Other deployer impact
---------------------
Deployers will have a finer granularity in selecting the disk device
to be used for the deployment.
.. note::
When specifing device size as a hint operator needs to make sure that
the value doesn't conflict with the local_gb properties of the node.
This is going to be documented as part of this spec.
Developer impact
----------------
None
Implementation
==============
Assignee(s)
-----------
Primary assignee:
lucasagomes
Other contributors:
None
Work Items
----------
* Make Ironic check for hints in the node.properties
* Pass the hint information to the deploy ramdisk and `IPA`_
* Add tests and documentation
* Modify the default deploy ramdisk in `diskimage-builder`_ to consider
the hints when picking the disk device
* Modify `IPA`_ to consider the hints when picking the disk device
Dependencies
============
* `bug 1398350`_ needs to be fixed.
Testing
=======
* Unit tests will be added
Upgrades and Backwards Compatibility
====================================
The change is backwards compatible since if hints are not specified
Ironic will continue to do what it does today (pick the first disk it
found for the deployment).
Documentation Impact
====================
A document explaining how hints works and what are the options and values
supported is going to be added.
References
==========
None
.. _`bug 1398350`: https://bugs.launchpad.net/ironic/+bug/1398350
.. _`diskimage-builder`: https://github.com/openstack/diskimage-builder/tree/master/elements/deploy-ironic
.. _`IPA`: https://github.com/openstack/ironic-python-agent