Interactions — 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
[observed] means seen on the local stub, which records what the real shell sends. Frames below are real client output; the answers came from the stub, not from a service.
There is no database, AMQP, cache or binary. A grep for subprocess, getpass, os.system, Popen, input( and stdin in the non-test code finds nothing, so the probe excluded no command on those grounds. Local files are limited to what python-openstackclient reads (clouds.yaml).
1. Keystone
| Call | When | Source |
|---|---|---|
GET /identity (version discovery) | once per invocation that needs auth | [observed] in all 82 commands |
POST /identity/v3/auth/tokens | once per invocation | [observed] in all 82 commands |
GET /identity/v3/projects/{value}, then GET /identity/v3/projects?name={value} | --project and the project argument of quota commands | octaviaclient/osc/v2/utils.py:172-179, [observed] |
The token's catalog must have a public entry of type load-balancer (octaviaclient/osc/plugin.py:32-36). If it is missing: public endpoint for load-balancer service in RegionOne region not found [observed]. It should also list network, see 02 § 5 item 2.
On a 403 for the project lookup, find_project builds a local object with the given value as ID (openstackclient:openstackclient/identity/common.py:367) [inferred: read in the docstring, not run].
2. Octavia
Base URL
<catalog endpoint, without trailing slash> + /v2.0, unless it already ends with /v2.0 (octaviaclient/api/v2/octavia.py:75, octaviaclient/api/v2/octavia.py:104-106).
| Catalog URL | Requests go to | Result |
|---|---|---|
http://host/load-balancer | /load-balancer/v2.0/… | works [observed] |
http://host/load-balancer/v2.0/ | /load-balancer/v2.0/… | works [observed] |
http://host/load-balancer/v2 | /load-balancer/v2/v2.0/… | wrong path [observed] |
No version document is read, and no microversion header is sent [observed: OpenStack-API-Version is absent from all recorded requests, and neither /load-balancer nor /load-balancer/v2.0 appears in any boot list]. The stub's version document was left generic since nothing asks for it, so it needed no fix.
Headers
| Header | Value | Source |
|---|---|---|
X-Auth-Token | the token | keystoneauth session, [observed] |
Accept | application/json | octaviaclient/api/v2/octavia.py:71, [observed] |
Content-Type | application/json when there is a body | keystoneauth json=, [observed] |
Routes
The 73 operations, one per client method, are in [_rewrite/api-surface_stable-2026.2.md](_rewrite/api-surface_stable-2026.2.md). Path constants are in octaviaclient/api/constants.py:32-87. All 73 were observed on the stub, and all exist in Octavia's OpenAPI except GET /lbaas/quotas/defaults (02 § 5 item 16). Octavia also accepts /v2/lbaas/…; the client uses only /v2.0/… [reverse-spec-octavia/01-rest-api_stable-2026.2.md, read].
The client never calls PUT /lbaas/pools/{id}/members (batch), GET /lbaas/quotas/{id}/default, or the /statuses alias.
Sample frames (required arguments only) [observed]
POST /load-balancer/v2.0/lbaas/loadbalancers
{"loadbalancer": {"vip_subnet_id": "{uuid}", "admin_state_up": true}}
POST /load-balancer/v2.0/lbaas/listeners
{"listener": {"loadbalancer_id": "{uuid}", "protocol": "TCP", "protocol_port": 1, "admin_state_up": true}}
POST /load-balancer/v2.0/lbaas/pools
{"pool": {"protocol": "TCP", "listener_id": "{uuid}", "lb_algorithm": "SOURCE_IP", "admin_state_up": true}}
POST /load-balancer/v2.0/lbaas/pools/{uuid}/members
{"member": {"address": "10.0.0.1", "protocol_port": 1}}
POST /load-balancer/v2.0/lbaas/healthmonitors
{"healthmonitor": {"pool_id": "{uuid}", "delay": 1, "timeout": 1, "max_retries": 1, "type": "PING", "admin_state_up": true}}
POST /load-balancer/v2.0/lbaas/l7policies
{"l7policy": {"listener_id": "{uuid}", "action": "REDIRECT_TO_URL", "redirect_url": "http://x/", "admin_state_up": true}}
POST /load-balancer/v2.0/lbaas/l7policies/{uuid}/rules
{"rule": {"compare_type": "REGEX", "value": "x", "type": "FILE_TYPE", "admin_state_up": true}}
POST /load-balancer/v2.0/lbaas/flavorprofiles
{"flavorprofile": {"name": "x", "provider_name": "x", "flavor_data": "{\"k\":\"v\"}"}}
PUT /load-balancer/v2.0/lbaas/quotas/{uuid}
{"quota": {"health_monitor": 1, "load_balancer": 1}}
PUT /load-balancer/v2.0/lbaas/quotas/{uuid}
{"quota": {"loadbalancer": null, "healthmonitor": null}}
DELETE /load-balancer/v2.0/lbaas/loadbalancers/{uuid}?cascade=True
GET /load-balancer/v2.0/lbaas/healthmonitors?tags=t1&tags=t2
GET /load-balancer/v2.0/lbaas/loadbalancers?admin_state_up=True
admin_state_up is sent by default on create for load balancers, listeners, pools, health monitors, policies and rules, since --enable defaults to true there. Members leave it out unless told (octaviaclient/osc/v2/member.py:112) [observed].
Types worth noting [observed]:
connection_limit: JSON string (octaviaclient/osc/v2/utils.py:262,octaviaclient/osc/v2/utils.py:337);insert_headers,session_persistence: objects of strings (octaviaclient/osc/v2/utils.py:758-765);flavor_data,availability_zone_data: strings holding JSON, as typed by the user (octaviaclient/osc/v2/utils.py:674,octaviaclient/osc/v2/utils.py:716);http_version: number (octaviaclient/osc/v2/utils.py:576);- unset fields:
null(octaviaclient/osc/v2/utils.py:780); tags: array; its order is not defined (octaviaclient/osc/v2/utils.py:827-829).
Responses the client reads
| What | Requirement | Source |
|---|---|---|
| list | {"<key>": [...], "<key>_links": [...]}; a missing <key> gives KeyError | octaviaclient/api/v2/octavia.py:92-94 |
| show | wrapper first; the client takes the first key's value | osc-lib:osc_lib/api/api.py:407-410 |
| create | {"<wrapper>": {...}} | for example octaviaclient/osc/v2/load_balancer.py:178 |
| set, unset, delete, failover, configure | body ignored; 202 and 204 with no body are fine [observed] | for example octaviaclient/osc/v2/load_balancer.py:488-489 |
| stats | {"stats": {...}}, or {"amphora_stats": [...]}, with numbers | octaviaclient/osc/v2/load_balancer.py:592, octaviaclient/osc/v2/amphora.py:252-256 |
| columns | a missing field is shown empty, not an error | osc-lib:osc_lib/utils/__init__.py:513 |
Collection keys: octaviaclient/api/constants.py:14-30. Note rules, amphorae, availability_zones, availability_zone_profiles, while the paths are /availabilityzones and /availabilityzoneprofiles.
Pagination
_list with get_all=True (octaviaclient/api/v2/octavia.py:82-102): it loops; adds the page's rows; looks in <key>_links for rel == next; parses that link's query; and uses it as the whole new parameter set. Only the query of the link is used, not its host or path. It sends no limit of its own. No page cap and no delay. Used by all list methods, except stats, status and quota defaults, which use a plain GET.
Lookups use the same path, so a name lookup follows pages too.
3. Neutron (through openstacksdk)
| Call | Option | Source |
|---|---|---|
GET /network/v2.0/subnets?id=<uuid> or ?name=<value> | --vip-subnet-id, --subnet-id, subnet-id= in --additional-vip | octaviaclient/osc/v2/utils.py:275-279, octaviaclient/osc/v2/utils.py:453-457, octaviaclient/osc/v2/utils.py:217-219 |
GET /network/v2.0/ports?… | --vip-port-id | octaviaclient/osc/v2/utils.py:270-274 |
GET /network/v2.0/networks?… | --vip-network-id | octaviaclient/osc/v2/utils.py:280-284 |
GET /network/v2.0/qos/policies?… | --vip-qos-policy-id | octaviaclient/osc/v2/utils.py:285-289 |
GET /network/v2.0/security-groups?… | --vip-sg-id | octaviaclient/osc/v2/utils.py:245-247 |
The Neutron error is shown as the SDK's text: NotFoundException: 404: Client Error for url: …, stub: not found [observed]. No Neutron version discovery was seen on the stub [observed: not in boot lists].
4. Token and secrets
- The token travels as
X-Auth-Token; the plugin does not read it. - The package handles no secret of its own. TLS references are URIs passed through as they are (
octaviaclient/osc/v2/utils.py:352). - Probe files hold neither tokens nor the stub password: only
X-Auth-Token: presentis recorded.
Source: reverse-spec-python-octaviaclient/03-interactions_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.