ironic/doc/source/admin/steps.rst

102 lines
4.8 KiB
ReStructuredText

=====
Steps
=====
What are steps?
===============
Steps are exactly that, steps to achieve a goal, and in most cases, they
are what an operator requested.
However, originally they were the internal list of actions to achieve to
perform *automated cleaning*. The conductor would determine a list of
steps or actions to take by generating a list of steps from data the
conductor via drivers, the ``ironic-python-agent``, and any loaded
hardware managers determined to be needed.
As time passed and Ironic's capabilities were extended, this was extended
to *manual cleaning*, and later into *deploy steps*, and *deploy templates*
allowing an operator to request for firmware to be updated by a driver, or
RAID to be configured by the agent prior to the machine being released
to the end user for use.
Reserved Functional Steps
=========================
In the execution of the cleaning, and deployment steps frameworks, some step
names are reserved for specific functions which can be invoked by a user to
perform specific actions.
+-----------+----------------------------------------------------------+
| Step Name | Description |
+-----------+----------------------------------------------------------+
| hold | Pauses the execution of the steps by moving the node |
| | from the current ``deploy wait`` or ``clean wait`` state |
| | to the appropriate "hold" state, such as ``deploy hold`` |
| | or ``clean hold``. The process can be resumed by sending |
| | a ``unhold`` verb to the provision state API endpoint |
| | which will result in the process resuming upon the next |
| | heartbeat operation. During this time, heartbeat |
| | operations will continue be recorded by Ironic, but will |
| | not be acted upon, preventing the node from timing out. |
| | |
| | This step cannot be used against a child node in the |
| | context of being requested when executing against a |
| | parent node. |
| | |
| | The use case for this verb is if you have external |
| | automation or processes which need to be executed in the |
| | entire process to achieve the overall goal. |
+-----------+----------------------------------------------------------+
| power_on | Powers on the node, which may be useful if a node's |
| | power must be toggled multiple times to enable |
| | embedded behavior such as to boot from network. |
| | This step can be executed against child nodes. |
+-----------+----------------------------------------------------------+
| power_off | Turn the node power off via the conductor. |
| | This step can be used against child nodes. When used |
| | outside of the context of a child node, any agent token |
| | metadata is also removed as so the machine can reboot |
| | back to the agent, if applicable. |
+-----------+----------------------------------------------------------+
| reboot | Reboot the node utilizing the conductor. This generally |
| | signals for power to be turned off and back on, however |
| | driver specific code may request an CPU interrupt based |
| | reset. This step can be executed on child nodes. |
+-----------+----------------------------------------------------------+
| wait | Causes a brief pause in the overall step execution which |
| | pauses until the next heartbeat operation, unless a |
| | seconds argument is provided. If a *seconds* argument is |
| | provided, then the step execution will pause for the |
| | requested amount of time. |
+-----------+----------------------------------------------------------+
In the these cases, the interface upon which the method is expected is
ignored, and the step is acted upon based upon just the step's name.
Example
-------
In this example, we utilize the cleaning step ``erase_devices`` and then
trigger hold of the node. In this specific case the node will enter
a ``clean hold`` state.
.. code-block:: json
{
"target":"clean",
"clean_steps": [{
"interface": "deploy",
"step": "erase_devices"
},
{
"interface": "deploy",
"step": "hold"
}]
}
Once you have completed whatever action which needed to be performed while
the node was in a held state, you will need to issue an unhold provision
state command, via the API or command line to inform the node to proceed.