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

Reverse-spec · Clients

python-octaviaclient — Interactions

Interactions — 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

[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

CallWhenSource
GET /identity (version discovery)once per invocation that needs auth[observed] in all 82 commands
POST /identity/v3/auth/tokensonce 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 commandsoctaviaclient/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 URLRequests go toResult
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

HeaderValueSource
X-Auth-Tokenthe tokenkeystoneauth session, [observed]
Acceptapplication/jsonoctaviaclient/api/v2/octavia.py:71, [observed]
Content-Typeapplication/json when there is a bodykeystoneauth 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

WhatRequirementSource
list{"<key>": [...], "<key>_links": [...]}; a missing <key> gives KeyErroroctaviaclient/api/v2/octavia.py:92-94
showwrapper first; the client takes the first key's valueosc-lib:osc_lib/api/api.py:407-410
create{"<wrapper>": {...}}for example octaviaclient/osc/v2/load_balancer.py:178
set, unset, delete, failover, configurebody 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 numbersoctaviaclient/osc/v2/load_balancer.py:592, octaviaclient/osc/v2/amphora.py:252-256
columnsa missing field is shown empty, not an errorosc-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)

CallOptionSource
GET /network/v2.0/subnets?id=<uuid> or ?name=<value>--vip-subnet-id, --subnet-id, subnet-id= in --additional-vipoctaviaclient/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-idoctaviaclient/osc/v2/utils.py:270-274
GET /network/v2.0/networks?…--vip-network-idoctaviaclient/osc/v2/utils.py:280-284
GET /network/v2.0/qos/policies?…--vip-qos-policy-idoctaviaclient/osc/v2/utils.py:285-289
GET /network/v2.0/security-groups?…--vip-sg-idoctaviaclient/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: present is recorded.

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