Asynchronous processing — python-octaviaclient — branch stable/2026.2
Branch
stable/2026.2@b37975ec8f2d(tag3.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.
| Process | Trigger | Type | Purpose | Reads | Effect | Defined at |
|---|---|---|---|---|---|---|
openstack | --wait, except on delete | polling, every 3 s, no limit | wait until provisioning_status is active or error, in any case | GET on the resource or its load balancer | exit 0, or OctaviaClientException | octaviaclient/osc/v2/utils.py:788-798 |
openstack | delete --wait, and amphora failover --wait for an amphora without load balancer | polling, every 3 s, 300 s | wait for a 404 | GET on the resource | exit 0, or OctaviaClientException | octaviaclient/osc/v2/utils.py:801-821 |
openstack | any list | loop on next links | fetch all pages | GET with the link's query | rows appended | octaviaclient/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']._Munchwraps the response dict so thatgetattrworks (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
ACTIVEjust after the request, the wait ends at once. A compatible service must leaveACTIVEbefore it answers the request [observed with a stub that always answersACTIVE: the command exits 0 on the first poll]. - Errors: a
GETfailure during polling ends the command with that failure. A missing status field gives'NoneType' object has no attribute 'lower'[observed]. - Cost: one
GETper 3 s per command.
wait_for_delete
- Loop:
osc-lib:osc_lib/utils/__init__.py:753-776. It readsprovisioning_status, orstatusfor amphorae (octaviaclient/osc/v2/amphora.py:289). - End: exception class named
NotFound(osc-lib's, raised byfind) means success (osc-lib:osc_lib/utils/__init__.py:760-762);erroror the 300 s limit means failure. - Other errors: an
OctaviaClientExceptionwith 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.