fix(api): document missing HTTP status codes on router endpoints
All checks were successful
CI / Lint (ruff) (push) Successful in 16s
CI / SAST (bandit) (push) Successful in 18s
CI / Dependency audit (pip-audit) (push) Successful in 26s
CI / Test (Standard) (3.11) (push) Successful in 2m41s
CI / Test (Live) (3.11) (push) Successful in 1m6s
CI / Test (Fuzz) (3.11) (push) Successful in 1h9m14s
CI / Finalize Merge to Main (push) Has been skipped
CI / Merge dev → testing (push) Successful in 12s
CI / Prepare Merge to Main (push) Has been skipped
All checks were successful
CI / Lint (ruff) (push) Successful in 16s
CI / SAST (bandit) (push) Successful in 18s
CI / Dependency audit (pip-audit) (push) Successful in 26s
CI / Test (Standard) (3.11) (push) Successful in 2m41s
CI / Test (Live) (3.11) (push) Successful in 1m6s
CI / Test (Fuzz) (3.11) (push) Successful in 1h9m14s
CI / Finalize Merge to Main (push) Has been skipped
CI / Merge dev → testing (push) Successful in 12s
CI / Prepare Merge to Main (push) Has been skipped
Schemathesis was failing CI on routes that returned status codes not declared in their OpenAPI responses= dicts. Adds the missing codes across swarm_updates, swarm_mgmt, swarm, fleet and attackers routers. Also adds 400 to every POST/PUT/PATCH that accepts a JSON body — Starlette returns 400 on malformed/non-UTF8 bodies before FastAPI's 422 validation runs, which schemathesis fuzzing trips every time. No handler logic changed.
This commit is contained in:
@@ -64,6 +64,10 @@ async def _probe_host(host: dict[str, Any]) -> HostReleaseInfo:
|
||||
"/hosts",
|
||||
response_model=HostReleasesResponse,
|
||||
tags=["Swarm Updates"],
|
||||
responses={
|
||||
401: {"description": "Could not validate credentials"},
|
||||
403: {"description": "Insufficient permissions"},
|
||||
},
|
||||
)
|
||||
async def api_list_host_releases(
|
||||
admin: dict = Depends(require_admin),
|
||||
|
||||
@@ -128,6 +128,13 @@ def _is_expected_connection_drop(exc: BaseException) -> bool:
|
||||
"/push",
|
||||
response_model=PushUpdateResponse,
|
||||
tags=["Swarm Updates"],
|
||||
responses={
|
||||
400: {"description": "Bad Request (malformed JSON body or conflicting host_uuids/all flags)"},
|
||||
401: {"description": "Could not validate credentials"},
|
||||
403: {"description": "Insufficient permissions"},
|
||||
404: {"description": "No matching target hosts or no updater-capable hosts enrolled"},
|
||||
422: {"description": "Request body validation error"},
|
||||
},
|
||||
)
|
||||
async def api_push_update(
|
||||
req: PushUpdateRequest,
|
||||
|
||||
@@ -68,6 +68,13 @@ async def _push_self_one(host: dict[str, Any], tarball: bytes, sha: str) -> Push
|
||||
"/push-self",
|
||||
response_model=PushUpdateResponse,
|
||||
tags=["Swarm Updates"],
|
||||
responses={
|
||||
400: {"description": "Bad Request (malformed JSON body or conflicting host_uuids/all flags)"},
|
||||
401: {"description": "Could not validate credentials"},
|
||||
403: {"description": "Insufficient permissions"},
|
||||
404: {"description": "No matching target hosts or no updater-capable hosts enrolled"},
|
||||
422: {"description": "Request body validation error"},
|
||||
},
|
||||
)
|
||||
async def api_push_update_self(
|
||||
req: PushUpdateRequest,
|
||||
|
||||
@@ -23,6 +23,13 @@ router = APIRouter()
|
||||
"/rollback",
|
||||
response_model=RollbackResponse,
|
||||
tags=["Swarm Updates"],
|
||||
responses={
|
||||
400: {"description": "Bad Request (malformed JSON body or host has no updater bundle)"},
|
||||
401: {"description": "Could not validate credentials"},
|
||||
403: {"description": "Insufficient permissions"},
|
||||
404: {"description": "Unknown host, or no previous release slot on the worker"},
|
||||
422: {"description": "Request body validation error"},
|
||||
},
|
||||
)
|
||||
async def api_rollback_host(
|
||||
req: RollbackRequest,
|
||||
|
||||
Reference in New Issue
Block a user