OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Reverse-spec · Clients

python-ironicclient — Async processing

Processing triggered outside the API — python-ironicclient — branch stable/2026.2

Branch stable/2026.2 @ af2ceeb9c4f2 — repository https://opendev.org/openstack/python-ironicclient — analysed on 2026-11-01

None in the background. The inventory found 0 triggers (_inventory/inventory_stable-2026.2.md), and reading the code confirms it: no consumer, no periodic task, no event, no background thread. Each command does its work in sequence, then the process ends. The one lock guards the first negotiation, for callers of the Python API that share a client (ironicclient/common/http.py:399, ironicclient/common/http.py:437).

The processing that does exist is client-side waiting, while the work happens in Ironic.

Polling a node: --wait

ironicclient/v1/node.py:1162, through ironicclient/osc/v1/baremetal_node.py:190, for the commands in 01 § 2.

  • Trigger: --wait [seconds]. The default is 0, which means no limit (ironicclient/common/utils.py:438). Each node is requested again until it reaches the state.
  • Interval: 2 or 10 seconds by action (ironicclient/v1/utils.py:23), or 2 by default in the Python API. The first check is immediate. The timeout is checked after the sleep, so a 1-second timeout waited 2 seconds [observed wait-manage-timeout].
  • Request: GET /v1/nodes/{id} with all fields (ironicclient/v1/node.py:1129).
  • Several nodes: all are polled together, and finished ones leave the list (ironicclient/v1/node.py:1216). The first failure stops the whole wait.
  • Decision (ironicclient/v1/node.py:1134), for one node: | Node seen | Result | |---|---| | {} from the server | keep waiting | | provision_state equals the expected state | done | | error, or a state ending in failed | StateTransitionFailed, with last_error | | no target_provision_state, other state | StateTransitionFailed, unexpected stable state; the Python API can turn this off | | anything else | keep waiting |
  • What the code requires: provision_state, target_provision_state and last_error in the node. A null provision_state gives a Python error at .endswith [inferred from ironicclient/v1/node.py:1141].
stateDiagram-v2
  [*] --> Polling: PUT states/provision accepted
  Polling --> Done: provision_state = expected
  Polling --> Failed: error or "... failed"
  Polling --> Failed: stable and not expected
  Polling --> TimedOut: timeout > 0 and elapsed
  Polling --> Polling: still moving, or {}

A timeout or a Ctrl-C stops only the client. The action goes on in Ironic.

Polling an allocation: --wait

ironicclient/v1/allocation.py:89, through ironicclient/osc/v1/baremetal_allocation.py:115: every second, GET /v1/allocations/{uuid}, until state is active. error raises with last_error. Other states continue [observed wait-allocation-ok, wait-allocation-error].

Retries

A short wait of its own: see 03 § 4.

Not implemented

No command waits for power state changes, or for console or BIOS operations. abort and unhold have no --wait (ironicclient/v1/utils.py:47, ironicclient/osc/v1/baremetal_node.py:196, ironicclient/osc/v1/baremetal_node.py:1070).

Source: reverse-spec-python-ironicclient/05-async-processing_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.