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

Reverse-spec · Clients

python-octaviaclient — Async processing

Asynchronous processing — python-octaviaclient — branch stable/2026.2

Branch stable/2026.2 @ b37975ec8f2d (tag 3.15.0 + 2 commits) — repository https://opendev.org/openstack/python-octaviaclient — analysed on 2026-11-01

There is no background processing. The package has no bus consumer, periodic task, event listener or thread: the inventory finds 0 RPC calls and 0 triggers (_inventory/inventory_stable-2026.2.md). A command is one short-lived process.

It has two client-side loops, both synchronous.

ProcessTriggerTypePurposeReadsEffectDefined at
openstack--wait, except on deletepolling, every 3 s, no limitwait until provisioning_status is active or error, in any caseGET on the resource or its load balancerexit 0, or OctaviaClientExceptionoctaviaclient/osc/v2/utils.py:788-798
openstackdelete --wait, and amphora failover --wait for an amphora without load balancerpolling, every 3 s, 300 swait for a 404GET on the resourceexit 0, or OctaviaClientExceptionoctaviaclient/osc/v2/utils.py:801-821
openstackany listloop on next linksfetch all pagesGET with the link's queryrows appendedoctaviaclient/api/v2/octavia.py:88-101

wait_for_active

  • Loop: osc-lib:osc_lib/utils/__init__.py:805-818. The first poll is immediate.
  • Status comparison: lower-cased against ['active'] and ['error']. _Munch wraps the response dict so that getattr works (octaviaclient/osc/v2/utils.py:784-785).
  • Timeout: none [observed: still running after 12 s, killed by the probe; unbounded by reading the code].
  • Race: if the service still answers ACTIVE just after the request, the wait ends at once. A compatible service must leave ACTIVE before it answers the request [observed with a stub that always answers ACTIVE: the command exits 0 on the first poll].
  • Errors: a GET failure during polling ends the command with that failure. A missing status field gives 'NoneType' object has no attribute 'lower' [observed].
  • Cost: one GET per 3 s per command.

wait_for_delete

  • Loop: osc-lib:osc_lib/utils/__init__.py:753-776. It reads provisioning_status, or status for amphorae (octaviaclient/osc/v2/amphora.py:289).
  • End: exception class named NotFound (osc-lib's, raised by find) means success (osc-lib:osc_lib/utils/__init__.py:760-762); error or the 300 s limit means failure.
  • Other errors: an OctaviaClientException with a code other than 404 is raised again (octaviaclient/osc/v2/utils.py:819-821). A 403 ends the command [observed].

Concurrency and idempotency

The client takes no lock. set --tag and unset --tag read then write with no precondition, so concurrent changes can lose tags (octaviaclient/osc/v2/utils.py:824-841) [read]. A failed --wait says nothing about the write, which was already accepted.

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