merge testing->tomerge/main #7

Open
anti wants to merge 242 commits from testing into tomerge/main
8 changed files with 52 additions and 6 deletions
Showing only changes of commit 5b70a34c94 - Show all commits

View File

@@ -25,7 +25,15 @@ from .swarm_updates import swarm_updates_router
from .swarm_mgmt import swarm_mgmt_router
from .system import system_router
api_router = APIRouter()
api_router = APIRouter(
# Every route under /api/v1 is auth-guarded (either by an explicit
# require_* Depends or by the global auth middleware). Document 401/403
# here so the OpenAPI schema reflects reality for contract tests.
responses={
401: {"description": "Missing or invalid credentials"},
403: {"description": "Authenticated but not authorized"},
},
)
# Authentication
api_router.include_router(login_router)

View File

@@ -18,7 +18,17 @@ from .api_check_hosts import router as check_hosts_router
from .api_heartbeat import router as heartbeat_router
from .api_list_deckies import router as list_deckies_router
swarm_router = APIRouter(prefix="/swarm")
swarm_router = APIRouter(
prefix="/swarm",
# Error responses that every swarm route can surface. Route-level
# `responses=` entries still override/extend these for route-specific
# codes (e.g. 409 on /enroll).
responses={
400: {"description": "Malformed request"},
403: {"description": "Peer cert missing or fingerprint mismatch"},
404: {"description": "Referenced host does not exist"},
},
)
# Hosts
swarm_router.include_router(enroll_host_router)

View File

@@ -26,6 +26,7 @@ router = APIRouter()
"/hosts/{uuid}",
status_code=status.HTTP_204_NO_CONTENT,
tags=["Swarm Hosts"],
responses={404: {"description": "No host with this UUID is enrolled"}},
)
async def api_decommission_host(
uuid: str,

View File

@@ -135,7 +135,15 @@ async def dispatch_decnet_config(
return SwarmDeployResponse(results=list(results))
@router.post("/deploy", response_model=SwarmDeployResponse, tags=["Swarm Deployments"])
@router.post(
"/deploy",
response_model=SwarmDeployResponse,
tags=["Swarm Deployments"],
responses={
400: {"description": "Deployment mode must be 'swarm'"},
404: {"description": "A referenced host_uuid is not enrolled"},
},
)
async def api_deploy_swarm(
req: SwarmDeployRequest,
repo: BaseRepository = Depends(get_repo),

View File

@@ -29,6 +29,7 @@ router = APIRouter()
response_model=SwarmEnrolledBundle,
status_code=status.HTTP_201_CREATED,
tags=["Swarm Hosts"],
responses={409: {"description": "A worker with this name is already enrolled"}},
)
async def api_enroll_host(
req: SwarmEnrollRequest,

View File

@@ -10,7 +10,12 @@ from decnet.web.db.models import SwarmHostView
router = APIRouter()
@router.get("/hosts/{uuid}", response_model=SwarmHostView, tags=["Swarm Hosts"])
@router.get(
"/hosts/{uuid}",
response_model=SwarmHostView,
tags=["Swarm Hosts"],
responses={404: {"description": "No host with this UUID is enrolled"}},
)
async def api_get_host(
uuid: str,
repo: BaseRepository = Depends(get_repo),

View File

@@ -96,7 +96,15 @@ async def _verify_peer_matches_host(
return host
@router.post("/heartbeat", status_code=204, tags=["Swarm Health"])
@router.post(
"/heartbeat",
status_code=204,
tags=["Swarm Health"],
responses={
403: {"description": "Peer cert missing, or its fingerprint does not match the host's pinned cert"},
404: {"description": "host_uuid is not enrolled"},
},
)
async def heartbeat(
req: HeartbeatRequest,
request: Request,

View File

@@ -21,7 +21,12 @@ log = get_logger("swarm.teardown")
router = APIRouter()
@router.post("/teardown", response_model=SwarmDeployResponse, tags=["Swarm Deployments"])
@router.post(
"/teardown",
response_model=SwarmDeployResponse,
tags=["Swarm Deployments"],
responses={404: {"description": "A targeted host does not exist"}},
)
async def api_teardown_swarm(
req: SwarmTeardownRequest,
repo: BaseRepository = Depends(get_repo),