diff --git a/specs/approved/ilo-uefi-iscsi-boot.rst b/specs/approved/ilo-uefi-iscsi-boot.rst new file mode 100644 index 00000000..3ff6d313 --- /dev/null +++ b/specs/approved/ilo-uefi-iscsi-boot.rst @@ -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 diff --git a/specs/not-implemented/ilo-uefi-iscsi-boot.rst b/specs/not-implemented/ilo-uefi-iscsi-boot.rst new file mode 120000 index 00000000..db67e683 --- /dev/null +++ b/specs/not-implemented/ilo-uefi-iscsi-boot.rst @@ -0,0 +1 @@ +../approved/ilo-uefi-iscsi-boot.rst \ No newline at end of file