Out-of-band Boot from UEFI iSCSI volume for HPE Proliant server
This change proposes to add a new methods in ilo management interface to support out-of-band booting from iSCSI Cinder volume for HPE Proliant Servers which supports booting from UEFI iSCSI volume in firmware. Co-Authored-By: Debayan Ray <debayan.ray@gmail.com> Co-Authored-By: Paresh Sao <paresh.h.sao@gmail.com> Partial-Bug: 1526861 Change-Id: I86fb4fa7913cc7f925b2e450c81fb618135bf169
This commit is contained in:
parent
58d4dfb768
commit
0783f0581f
|
@ -0,0 +1,302 @@
|
|||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
===============================
|
||||
UEFI iSCSI Boot for iLO drivers
|
||||
===============================
|
||||
|
||||
https://bugs.launchpad.net/ironic/+bug/1526861
|
||||
|
||||
HPE ProLiant Servers (Gen9 and beyond) supports UEFI iSCSI Boot through its
|
||||
firmware. The proposed feature is to add support for this firmware based
|
||||
booting of an iSCSI Cinder volume in UEFI mode for Ironic iLO drivers.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Currently, Ironic has ability to boot from Cinder volume. Moreover, this
|
||||
support is to boot from an iSCSI volume using bootloaders like iPXE. It
|
||||
doesn't provide any way to harness the feature of some servers which
|
||||
inherently supports booting from an iSCSI volume using their firmware
|
||||
capabilities. Hardware can be configured programmatically to boot from an
|
||||
iSCSI volume through firmware.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
This change is based on the reference driver implementation guidelines
|
||||
proposed by `Boot from Volume - Reference Drivers`_ spec to support booting
|
||||
ironic nodes from a storage device that is hosted and/or controlled remotely. This
|
||||
change proposes two new methods for iLO drivers management interface; namely
|
||||
``set_iscsi_boot_target`` and ``clear_iscsi_boot_target``, which will facilitate
|
||||
setting and clearing iSCSI target information using iLO interfaces for UEFI
|
||||
iSCSI boot capable HPE Proliant servers.
|
||||
|
||||
The boot interface method ``prepare_instance()`` in ``ilo`` hardware type
|
||||
will check if the instance requested boot mode is 'UEFI' and given volume is
|
||||
bootable. If so, it will set the iSCSI target in the iLO and set boot device
|
||||
to iSCSI target.
|
||||
|
||||
If the instance requested boot mode is 'BIOS' the behavior for the two boot
|
||||
interfaces (``ilo-pxe`` and ``ilo-virtual-media``) will be as under:
|
||||
|
||||
* ``ilo-pxe`` : It will fallback to iPXE to boot the volume.
|
||||
|
||||
* ``ilo-virtual-media``: It will throw the following error:
|
||||
``virtual media cannot boot volume in bios.``
|
||||
|
||||
The function definition for ``ilo-pxe`` boot interface with its pseudo-code
|
||||
will be as follows:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class IloPXEBoot(pxe.PXEBoot):
|
||||
|
||||
def prepare_instance(self, task):
|
||||
"""Prepares the boot of instance.
|
||||
|
||||
:param task: a task from TaskManager.
|
||||
:returns: None
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
if deploy_utils.is_iscsi_boot(task) and boot_mode == 'uefi':
|
||||
#Call the management interface
|
||||
task.driver.management.set_iscsi_boot_target(task)
|
||||
#Set boot device to 'ISCSIBOOT'
|
||||
deploy_utils.try_set_boot_device(task, boot_devices.ISCSIBOOT)
|
||||
|
||||
else:
|
||||
#Let iPXE handle this
|
||||
super(IloPXEBoot, self).prepare_instance(task)
|
||||
|
||||
def clean_up_instance(self, task):
|
||||
"""Cleans up the boot of instance.
|
||||
|
||||
:param task: a task from TaskManager.
|
||||
:returns: None
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
if deploy_utils.is_iscsi_boot(task) and boot_mode == 'uefi':
|
||||
#Call the management interface
|
||||
task.driver.management.clear_iscsi_boot_target(task)
|
||||
|
||||
else:
|
||||
#Let iPXE handle this
|
||||
super(IloPXEBoot, self).clean_up_instance(task)
|
||||
|
||||
The function definition for ``ilo-virtual-media`` boot interface with its
|
||||
pseudo-code will be as follows:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class IloVirtualMediaBoot(base.BootInterface):
|
||||
|
||||
def prepare_instance(self, task):
|
||||
"""Prepares the boot of instance.
|
||||
|
||||
:param task: a task from TaskManager.
|
||||
:returns: None
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
if deploy_utils.is_iscsi_boot(task) and boot_mode == 'uefi':
|
||||
#Call the management interface
|
||||
task.driver.management.set_iscsi_boot_target(task)
|
||||
#Set boot device to 'ISCSIBOOT'
|
||||
deploy_utils.try_set_boot_device(task, boot_devices.ISCSIBOOT)
|
||||
return
|
||||
|
||||
elif deploy_utils.is_iscsi_boot(task) and boot_mode == 'bios':
|
||||
#Throw the error in bios boot mode
|
||||
msg = 'virtual media can not boot volume in bios mode.'
|
||||
raise exception.InstanceDeployFailure(msg)
|
||||
|
||||
else:
|
||||
#Default code
|
||||
|
||||
def clean_up_instance(self, task):
|
||||
"""Cleans up the boot of instance.
|
||||
|
||||
:param task: a task from TaskManager.
|
||||
:returns: None
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
if deploy_utils.is_iscsi_boot(task) and boot_mode == 'uefi':
|
||||
#Call the management interface
|
||||
task.driver.management.clear_iscsi_boot_target(task)
|
||||
else:
|
||||
#Fall to virtual media cleanup
|
||||
|
||||
|
||||
Two new methods will be added in ``ilo`` drivers management interface
|
||||
``ilo.management.IloManangement``:
|
||||
* set_iscsi_boot_target() - To set iSCSI target information into iLO
|
||||
* clear_iscsi_boot_target() - To clear iSCSI target information from iLO
|
||||
|
||||
New version of proliantutils library would be released that supports the
|
||||
above mentioned methods.
|
||||
|
||||
The function definition with its pseudo-code will be as follows:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class IloManagement(base.ManagementInterface):
|
||||
|
||||
def set_iscsi_boot_target(self, task):
|
||||
"""Set iscsi boot volume target info from the node.
|
||||
|
||||
:param task: a task from TaskManager.
|
||||
"""
|
||||
#Proliants call to set iscsi target info
|
||||
|
||||
def clear_iscsi_boot_target(self, task):
|
||||
"""Clear iscsi boot volume target info from the node.
|
||||
|
||||
:param task: a task from TaskManager.
|
||||
"""
|
||||
#Library call to clear iscsi target info
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
None.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None.
|
||||
|
||||
State Machine Impact
|
||||
--------------------
|
||||
|
||||
None.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None.
|
||||
|
||||
Client (CLI) impact
|
||||
-------------------
|
||||
|
||||
None.
|
||||
|
||||
RPC API impact
|
||||
--------------
|
||||
|
||||
None.
|
||||
|
||||
Driver API impact
|
||||
-----------------
|
||||
|
||||
None.
|
||||
|
||||
Nova driver impact
|
||||
------------------
|
||||
|
||||
None.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None.
|
||||
|
||||
Ramdisk impact
|
||||
--------------
|
||||
|
||||
None.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None.
|
||||
|
||||
Scalability impact
|
||||
------------------
|
||||
|
||||
None.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None.
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
Deployers will be able to configure server which support UEFI iSCSI boot with
|
||||
this change. The workflow will be as follows:
|
||||
|
||||
* Operator configures the node with appropriate hardware type with boot
|
||||
interface and adds the capability ``iscsi_boot=true`` in
|
||||
``node.properties['capabilities']`` (or it could be populated by
|
||||
inspection, but it's not part of this spec on how it gets populated).
|
||||
* Operator creates a flavor with Compute capability ``iscsi_boot=true`` to
|
||||
request bare metal booting from Cinder volume.
|
||||
* Tenant creates a Cinder volume.
|
||||
* Tenant requests a bare metal instance to be booted up with a Cinder volume
|
||||
with the above mentioned flavor.
|
||||
* Node having 'ilo-virtual-media' as boot interface with capability
|
||||
'iscsi_boot=true' should also have capability 'boot_mode' configured
|
||||
to 'uefi' only.
|
||||
* Nova Ironic virt driver passes information about iSCSI volume to Ironic.
|
||||
For more information, refer ironic spec
|
||||
`Add volume connection information for Ironic nodes`_.
|
||||
|
||||
.. _`Add volume connection information for Ironic nodes`: https://specs.openstack.org/openstack/ironic-specs/specs/9.0/volume-connection-information.html
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
kesper
|
||||
Other contributors:
|
||||
deray
|
||||
stendulker
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Need to add changes in ``ilo-pxe`` and ``ilo-virtual-media`` boot
|
||||
interfaces.
|
||||
|
||||
* Need to implement ``set_iscsi_boot_target`` and ``clear_iscsi_boot_target``
|
||||
in ``ilo`` management interface.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
None.
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
This feature would be tested using HPE iLO third-party CI.
|
||||
|
||||
Upgrades and Backwards Compatibility
|
||||
====================================
|
||||
|
||||
None.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
iLO drivers documentation will be updated for this feature.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
* `Boot from Volume - Reference Drivers`_
|
||||
|
||||
.. _`add support in Ironic framework`: https://specs.openstack.org/openstack/ironic-specs/specs/approved/volume-connection-information.html
|
||||
.. _`Boot from Volume - Reference Drivers`: https://specs.openstack.org/openstack/ironic-specs/specs/approved/boot-from-volume-reference-drivers.html
|
||||
.. _`iLO UEFI Deployment Guide`: https://support.hpe.com/hpsc/doc/public/display?docId=c04565930
|
|
@ -0,0 +1 @@
|
|||
../approved/ilo-uefi-iscsi-boot.rst
|
Loading…
Reference in New Issue