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



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.


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.


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 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.


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.


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.

  "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.