48177d4a5c
The spec template has a license header, and all approved specs contain this header, save for one. This patch adds the missing CC-BY-UL license header to ironic-ilo-virtualmedia-driver A future patch should add a test for this. Change-Id: I112003ad198b55decc5e6ab8585314433f836cfb
356 lines
12 KiB
ReStructuredText
356 lines
12 KiB
ReStructuredText
..
|
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
|
License.
|
|
|
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
|
|
|
=====================================
|
|
iLO Virtual Media iSCSI Deploy Driver
|
|
=====================================
|
|
|
|
https://blueprints.launchpad.net/ironic/+spec/ironic-ilo-virtualmedia-driver
|
|
|
|
Add ability to provision proliant baremetal nodes (having iLO4 and beyond)
|
|
by booting the baremetal node with virtual media and using iscsi from conductor
|
|
node to deploy the image (reusing existing deploy mechanism).
|
|
|
|
Problem description
|
|
===================
|
|
|
|
- Today Ironic's PXE reference driver uses pxe protocol to boot the machine.
|
|
Some customer's don't prefer PXE protocol in their environment because of
|
|
it unreliability and security issues.
|
|
- Today Ironic's PXE reference driver passes the keystone authentication token
|
|
in clear text over tftp on the data network to the baremetal node.
|
|
|
|
Proposed change
|
|
===============
|
|
|
|
The proposed change for Ironic deploy will happen in two stages:
|
|
|
|
* Refactor the iSCSI deploy code in current pxe deploy driver into a new module
|
|
ironic/drivers/modules/iscsi_deploy.py so that it can be reused in a new
|
|
deploy driver.
|
|
|
|
* Add two new methods ``create_vfat_image`` and ``create_iso_image`` in
|
|
ironic/common/images.py for creating vfat images and iso images respectively.
|
|
The vfat images will be used for passing the token and parameters to the
|
|
ramdisk when it is booted over virtual media. The ISO image will be used for
|
|
booting up the kernel/ramdisk on the baremetal machine.
|
|
|
|
* Add a new module ironic/common/swift.py to manage objects in swift.
|
|
|
|
* Add two generic methods ``setup_virtual_media_boot`` and
|
|
``cleanup_virtual_media__boot`` which helps in setting up and cleanup up
|
|
virtual media for booting respectively.
|
|
|
|
* Create a new deploy module named ``IloVirtualMediaIscsiDeploy`` in
|
|
ironic/drivers/modules/ilo/deploy.py which adheres to
|
|
``base.DeployInterface``.
|
|
|
|
* Create a new class ``VendorPassthru`` which adheres to
|
|
``base.VendorInterface`` in ironic/drivers/modules/ilo/deploy.py.
|
|
Implement a vendor passthru method ``pass_deploy_info`` in it.
|
|
|
|
* The reboot() method in ``IloPower`` module will be changed.
|
|
|
|
|
|
Changes in Detail
|
|
-----------------
|
|
|
|
Virtual media for booting
|
|
-------------------------
|
|
This class exposes the following methods:
|
|
|
|
setup_virtual_media_boot()
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
- Validate that the node's iLO has virtual media feature enabled using
|
|
proliantutils module. If the node doesn't have virtual media feature, it
|
|
comes out with error.
|
|
- If ``boot_parameters`` is not empty:
|
|
|
|
- Create a virtual floppy image containing the user token and a config
|
|
file, which contains ``boot_parameters``.
|
|
- Upload the virtual floppy image to swift. Set ``X-Delete-After`` for swift
|
|
to delete the image after ``deploy_helper_images_ttl`` minutes. The default
|
|
value will be 10 minutes. Upload to container ``swift_ilo_container`` whose
|
|
default value will be "ironic_ilo_container".
|
|
- Generate the swift temp url for virtual floppy image. Let it be named as
|
|
floppy_image_temp_url. The timeout of tmpurl will be
|
|
``deploy_helper_images_ttl`` minutes.
|
|
- Attach floppy_image_temp_url as virtual media floppy in the iLO. Set the
|
|
timeout to ``deploy_helper_images_ttl``
|
|
- Generate tmpurl for ``boot_iso`` and attach it as virtual media cdrom. The
|
|
timeout of tmpurl will be ``deploy_helper_images_ttl`` minutes.
|
|
- Set the baremetal node to boot from virtual media cdrom for the next boot
|
|
using proliantutils module with BOOT_ONCE option.
|
|
|
|
cleanup_virtual_media_boot()
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
- Remove the virtual media floppy image uploaded to swift for the node. The
|
|
object name in swift will be "image-<node uuid>"
|
|
|
|
ironic/common/swift.py
|
|
----------------------
|
|
This module will provide a class SwiftAPI which will handle the creation
|
|
and managing swift objects. This SwiftAPI module by default will use admin
|
|
credentials for talking to swift. The user of this module may also choose to
|
|
pass ``user``, ``tenant_name``, ``key``, ``authurl`` to create the swiftAPI
|
|
object.
|
|
|
|
- *upload_object* - Creates the container if required and requested, and
|
|
then creates the new object in swift using swiftclient. Returns the swift
|
|
object id.
|
|
- *delete_object* - Deletes the object from the mentioned swift container.
|
|
- *get_tmp_url* - This will call the ``swift_utils.generate_temp_url()`` which
|
|
is available in python-swiftclient.
|
|
|
|
|
|
ironic/common/images.py
|
|
-----------------------
|
|
Add a new method ``create_vfat_image`` which helps in creating
|
|
virtual floppy images. This method takes the files and parameters to be
|
|
included in the floppy image as input, and then creates a vfat floppy image.
|
|
|
|
Add a new method ``create_iso_image`` which helpsin creating ISO images.
|
|
This method takes the files and parameters to be included in the ISO as input,
|
|
and then creates the ISO image.
|
|
|
|
The common components between the two methods above will be reused.
|
|
|
|
ironic/drivers/modules/iscsi_deploy.py
|
|
--------------------------------------
|
|
This module will refactor every method belonging to the iscsi deploy mechanism
|
|
from the pxe driver. The following methods will be moved to the new module:
|
|
|
|
- parse_instance_info()
|
|
- _cache_instance_image
|
|
- InstanceImageCache
|
|
- _check_image_size
|
|
- _destroy_images()
|
|
- _get_deploy_info
|
|
- _continue_deploy()
|
|
|
|
Minor changes will be required in the refactoring to remove the "pxe" portions
|
|
out of the above methods.
|
|
|
|
IloVirtualMediaIscsiDeploy
|
|
--------------------------
|
|
This class will implement the following:
|
|
|
|
- *validate()* - Validates that node has ports added, parses deploy_info(),
|
|
checks that conductor api url is available, and validates that ``deploy_iso``
|
|
property exists in driver_info of node. Most of the functions from
|
|
refactored iscsi_deploy is used.
|
|
- *deploy()* - Caches instance image, uses virtual media boot helper method
|
|
``setup_virtual_media_boot`` to setup the machine for booting with
|
|
driver_info['deploy_iso'].
|
|
- *tear_down()* - Powers down the node.
|
|
- *clean_up()* - Destroys the images, calls ``cleanup_virtual_media_boot``
|
|
method to clean the temporary floppy images. Decrements the ``usage_count``
|
|
for ``boot_iso`` in swift and destroys the boot ISO image if the
|
|
``usage_count`` meta-property becomes 0 (if ``boot_iso`` was created by
|
|
ironic).
|
|
|
|
prepare() and take_over() will be empty.
|
|
|
|
VendorPassthru
|
|
--------------
|
|
Implement a new vendor passthru method 'pass_deploy_info'. This vendor passthru
|
|
method will call continue_deploy() from iscsi_deploy.py.
|
|
|
|
After deploying over iSCSI, it checks the following in that order to pick up
|
|
a boot ISO:
|
|
|
|
- If user has specified a boot ISO in glance image, then it picks up this.
|
|
- Checks if a boot_iso is already available for the mentioned (image, kernel,
|
|
ramdisk) for the image in swift on ``swift_ilo_container`` (by hashing the
|
|
UUIDs of the image, kernel, ramdisk to get a unique name). If the boot
|
|
iso exists, then the ``usage_count`` swift meta-property for the swift
|
|
object is incremented by 1.
|
|
- If we still can't find boot ISO, it creates a bootable ISO image, uploads
|
|
it to swift on ``swift_ilo_container`` with the generated name and
|
|
sets ``usage_count`` to 1.
|
|
|
|
It then records the information about ``boot_iso`` in node's
|
|
``instance_info[boot_iso]``
|
|
|
|
IloPower reboot()
|
|
-----------------
|
|
If node has ``boot_iso`` in its instance_info, use ``setup_virtual_media_boot``
|
|
to set the machine to boot from ``boot_iso``.
|
|
|
|
Alternatives
|
|
------------
|
|
The proliant baremetal machines could be booted with proposed iPXE, but even
|
|
that will involve booting the machine with PXE to load the iPXE software. Also
|
|
it would not solve the security issues in token handoff to baremetal node.
|
|
|
|
Data model impact
|
|
-----------------
|
|
The new deploy driver will use two new parameters:
|
|
|
|
- driver_info['deploy_iso'] - This will be used to boot up the node before the
|
|
deploy.
|
|
- instance_info['boot_iso'] - This is set by the deploy driver once the
|
|
baremetal node deploy completes.
|
|
|
|
REST API impact
|
|
---------------
|
|
One vendor_passthru method will be added:
|
|
|
|
pass_deploy_info:
|
|
|
|
* Description: The deploy ramdisk built using deploy-ironic element of
|
|
diskimage-builder will call this method on the node. It will also pass
|
|
the required information for completing the deploy after connecting to the
|
|
baremetal node's local disk using iSCSI.
|
|
|
|
* Method type: POST
|
|
|
|
* Normal response code: 200
|
|
|
|
* Expected errors: 400: Insufficient/Invalid data sent or some data for
|
|
deployment missing.
|
|
|
|
* URL: /{api_version}/nodes/<node-uuid>/vendor_passthru/pass_deploy_info
|
|
|
|
* Parameters:
|
|
|
|
+ ``address`` - Address of the baremetal node.
|
|
+ ``key`` - The deployment key generated by ironic.
|
|
+ ``iqn`` - The iqn of the target disk on baremetal node where the image has
|
|
to be deployed.
|
|
+ ``error`` - The error message if some error was encountered.
|
|
|
|
* Body JSON schema::
|
|
|
|
{
|
|
"address": "10.10.1.150"
|
|
"iqn": "iqn-12345678-1234-1234-1234-1234567890abcxyz"
|
|
"key": "1234567890"
|
|
"error": ""
|
|
}
|
|
|
|
* Response JSON: None
|
|
|
|
Driver API impact
|
|
-----------------
|
|
None.
|
|
|
|
Nova driver impact
|
|
------------------
|
|
No changes are required on the nova ironic virt driver. The new iLO driver
|
|
will continue to use the below 5 parameters set by nova ironic virt driver in
|
|
the node's instance_info:
|
|
|
|
- ``image_source``
|
|
- ``root_gb``
|
|
- ``swap_mb``
|
|
- ``ephemeral_gb``
|
|
- ``ephemeral_format``
|
|
|
|
Security impact
|
|
---------------
|
|
- The PXE driver requires the admin token to be available on tftp
|
|
which can be accessed by anyone in the deploy network (since the filename of
|
|
the token is predicatable, which is token-<node uuid>). In virtual media
|
|
boot, the user token is sent to the conductor node securely over https
|
|
through OOB channel. Hence, this deploy method can be used for more secure
|
|
deployments.
|
|
|
|
- The virtual floppy image is uploaded to a swift container with user token
|
|
and is destroyed automatically by swift after the timeout. It is recommended
|
|
to use a separate container to secure the floppy images.
|
|
|
|
- Glance backed by swift can be configured to store the images such that the
|
|
owner of the image and a defined list of admin accounts will be able to
|
|
access the image. For more information refer using
|
|
``swift_store_multi_tenant`` in [1].
|
|
|
|
Other end user impact
|
|
---------------------
|
|
None
|
|
|
|
Scalability impact
|
|
------------------
|
|
None.
|
|
|
|
Performance Impact
|
|
------------------
|
|
None.
|
|
|
|
Other deployer impact
|
|
---------------------
|
|
The cloud operator is supposed to do the following as part of configuring the
|
|
iLO driver:
|
|
|
|
- Upload the deploy_iso to glance and mention its UUID in
|
|
driver_info['deploy_iso'].
|
|
|
|
Also, the user/operator may also optionally specify a ``boot_iso`` from which
|
|
the kernel/ramdisk can be booted off for a deploy image. This may be
|
|
specified as a glance meta-property ``boot_iso`` for the image to be deployed.
|
|
|
|
Utilities will be provided in diskimage-builder for creating the deploy ISO.
|
|
|
|
This method of deploy doesn't require an extra service (like tftp service
|
|
incase of pxe driver) to be running on the conductor node.
|
|
|
|
Developer impact
|
|
----------------
|
|
None.
|
|
|
|
Known Limitation
|
|
----------------
|
|
- If the user needs to reboot the baremetal node, then the reboot needs to be
|
|
triggered from Ironic (or from Nova).
|
|
|
|
- If the user needs to issue an inband reboot of the baremetal node (reboot
|
|
from within the baremetal node), then the baremetal node will fail to boot.
|
|
In such a case, the user may just issue a reboot from ironic again to get the
|
|
node booted up.
|
|
|
|
Implementation
|
|
==============
|
|
|
|
Assignee(s)
|
|
-----------
|
|
Primary assignee:
|
|
rameshg87
|
|
|
|
Work Items
|
|
----------
|
|
The work will be split up into following separate items (or patches):
|
|
|
|
1. Refactor the iSCSI deploy code in current pxe deploy driver.
|
|
2. Implement the changes to ironic/common/images.py module.
|
|
3. Implement the ironic/common/swift.py module.
|
|
4. Implement the virtual media boot helper methods, add the new deploy driver
|
|
and new vendor passthru module.
|
|
5. Implement the changes to reboot() method in IloPower.
|
|
|
|
Dependencies
|
|
============
|
|
Depends on hpproliant module:
|
|
|
|
- https://github.com/hpproliant/proliantutils
|
|
|
|
Testing
|
|
=======
|
|
Unit tests will be added for all the code.
|
|
|
|
Tempest tests for the deploy will be considered later.
|
|
|
|
Documentation Impact
|
|
====================
|
|
The procedure for configuring the proliant baremetal node will need to be
|
|
documented. This will be documented in rst format in doc/ directory in ironic
|
|
source tree. The contents of this file can be put in ironic wiki as well.
|
|
|
|
References
|
|
==========
|
|
1. http://docs.openstack.org/admin-guide-cloud/content/configuring-tenant-specific-storage-for-images.html
|