ironic-specs/specs/juno-implemented/new-management-interface.rst

222 lines
5.9 KiB
ReStructuredText

..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
==============================
New driver ManagementInterface
==============================
https://blueprints.launchpad.net/ironic/+spec/new-management-interface
This blueprint consolidates the work needed for the creation of a new
driver interface for management-like operations and a new REST API
resource to expose those methods.
Problem description
===================
Almost all Power Interfaces (except the SSH Power Interface) expose a
method to set the boot device on their Vendor Passthru interface, this
blueprint intends to promote this method to an official interface.
Setting the boot device doesn't fit into the current driver interfaces,
even if right now it's part of the Vendor Passthru of the Power Interfaces
it's not actually a power operation, so this blueprint will also include
the creation of a new interface called Management Interface where such
management operations can be exposed.
As noted in the first paragraph the SSH Power Interface doesn't expose
any method to set the boot device, so this is going to be implemented
as part of this blueprint. We need all drivers to adhere to the new
interface so that it's consistent.
As for the API changes, a new 'management' subresource will be added to
nodes resource of the REST API and will expose ways to get the supported
boot devices and set/get the boot device of a given node. In the future
more operations could be added to the management interface, for example:
get_sensor_data()[1], update_firmware(), get_firmware_list(), etc...
Proposed change
===============
* Create a new ManagementInterface which expose the methods:
- validate() - To validate driver-specific management
information. (E.g if the node has the right credentials already set)
- set_boot_device() - To set the boot device for a specific node.
- get_boot_device() - To get the current boot device of a specific node.
- get_supported_boot_devices() - To get a list of the supported boot
devices by that driver.
* Port the set_boot_device() method from the Vendor Passthru interface
to the new interface.
* Add a ManagementInterface for ssh, and implement the set_boot_device()
for it
* Create a new /nodes/<uuid>/management/boot_device subresource in the
REST API to expose ways to the client to {set,get} the boot device for
a node.
- To set the boot device:
PUT {'boot_device': 'pxe'}
/nodes/<uuid>/management/boot_device[?persistent=<bool>]
If the request was completed successfully HTTP 204 (No Content)
is returned.
If an invalid or not supported boot device parameter is passed it
should return 400 (Bad Request).
The "persistent" flag can be set to indicate whether the boot device
changes should be applied for the next boot only or to all future
boots. By default persistent will be False.
- To get the current boot device:
GET /nodes/<uuid>/management/boot_device
Returns a dictionary with the boot device and if it's persistent or
not. E.g:
{'boot_device': 'pxe', 'persistent': True}
If 'boot_device' is unknown the value of it will be None (The seamicro
python library doesn't seem to expose a way to get the current boot
device, only set it[3]).
If 'persistent' is unknown the value of it will be None (The pyghmi
method to get the current boot device and doesn't indicate whether
it's persistent or not[3]. For setting the boot device, it's possible
to indicate whether it's persistent or not).
- To get the supported boot devices:
GET /nodes/<uuid>/management/boot_device/supported
This will return a list of all supported boot devices (not the
boot order).
* Update the Ironic client and library to support the new API resource.
Alternatives
------------
Continue to use the Vendor Passthru interface.
Data model impact
-----------------
None
REST API impact
---------------
* A new /nodes/<uuid>/management/boot_device subresource will be added
to the API, requests to set or get the boot device for a node should
go there so that methods like set_boot_device won't be exposed via the
vendor_passthru anymore.
* The nodes/<uuid>/validate will include the management interface.
Driver API impact
-----------------
* The new ManagementInterface will be included in the standardized
interfaces group.
* The ipmitool, ipminative, seamicro and ssh drivers are going to be
updated to use this new interface.
Nova driver impact
------------------
None
Security impact
---------------
None
Other end user impact
---------------------
None
Scalability impact
------------------
None
Performance Impact
------------------
None
Other deployer impact
---------------------
None
Developer impact
----------------
None
Implementation
==============
Assignee(s)
-----------
Primary assignee:
lucasagomes
Other contributors:
None
Work Items
----------
* Create the new ManagementInterface base class.
* Port the set_boot_device() method from the Vendor Passthru interface
of the ipmitool, ipminative, seamicro drivers to the new interface.
* Implement the missing methods on the ssh, ipmitool, ipminative,
seamicro drivers.
* Implement the REST API to expose the new interface.
Dependencies
============
None
Testing
=======
* Unit tests will be added/updated to cover the changes.
* Tempest tests will be added to Ironic to ensure that the new
/nodes/<uuid>/management/boot_device is working properly.
Documentation Impact
====================
The Architecture documentation should be updated to include the new
Management Interface.
References
==========
[1] http://specs.openstack.org/openstack/ironic-specs/specs/juno/send-data-to-ceilometer.html
[2] https://github.com/seamicro/python-seamicroclient/blob/master/seamicroclient/v2/servers.py#L24
[3] https://github.com/stackforge/pyghmi/blob/master/pyghmi/ipmi/command.py#L123