Skip to content

chore(api): sync OpenAPI contract - #2

Draft
kong[bot] wants to merge 1 commit into
mainfrom
chore/sync-openapi
Draft

kong[bot] wants to merge 1 commit into
mainfrom
chore/sync-openapi

Conversation

@kong

@kong kong Bot commented Aug 28, 2026 •

Copy link
Copy Markdown

Summary

API change report

Public API

New Endpoints: 3


GET /projects/{id}/autofix-runs
GET /projects/{id}/autofix-runs/{runId}
POST /projects/{id}/issues/{issueId}/autofix-runs

Deleted Endpoints: None


Modified Endpoints: 39


POST /auth/forgot-password

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /auth/logout

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /auth/oauth/exchange

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Missing or invalid project anon key' to 'Missing or invalid project anon key; or invalid auth proxy metadata'

GET /auth/password-policy

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid, missing, or revoked anon key' to 'Invalid, missing, or revoked anon key; or invalid auth proxy metadata'

POST /auth/refresh

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid or expired refresh token' to 'Invalid or expired refresh token; or invalid auth proxy metadata'

POST /auth/reset-password

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid or expired token' to 'Invalid or expired token; or invalid auth proxy metadata'

POST /auth/signin

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Unauthorized - Invalid credentials, invalid/tampered/revoked anon key,
        or account banned/deleted
        ' to 'Unauthorized - Invalid credentials, invalid/tampered/revoked anon key,
        or account banned/deleted; or invalid auth proxy metadata
        '

POST /auth/signup

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Unauthorized - Invalid, tampered, revoked, or wrong-project anon key
        ' to 'Unauthorized - Invalid, tampered, revoked, or wrong-project anon key.
        Also returned for invalid, repeated, or under-scoped auth proxy metadata
        (invalid auth proxy metadata).
        '

POST /auth/signup-anonymous

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /functions/{functionId}/invoke

  • Description changed from 'Invoke a function. The function's visibility decides which credentials
    may call it, and the function does not run for any other. A private
    function answers every credential but a service key exactly as a
    missing one, with 404, so its name and id cannot be discovered; an anon
    key on an authenticated function gets 403. An SDK calling by name
    resolves it first through GET /functions/resolve, which answers that
    anon key with 404 instead.

With Service Key (admin/background operations, every visibility):

  • Use for background jobs, webhooks, cron, admin operations
  • Function receives payload only (no user context)
  • Database queries bypass RLS (admin access)

With Auth User Token (user-facing, authenticated or public functions):

  • Use for user-initiated actions
  • Includes users from anonymous sign-ins
  • Function receives payload + __volcano_auth context:
    {
      user_id: "uuid",
      email: "user@example.com",
      project_id: "uuid",
      role: "authenticated" or "anonymous"
    }
  • Database queries enforce RLS (user-scoped data)

With Anon Key (public functions only):

  • Requires anon key permission: functions.invoke
  • Function must have visibility: public
  • Function receives payload only (no __volcano_auth)

Transport and CORS:

  • This operation is the authenticated direct RPC endpoint and always uses the
    POST {payload: ...} contract, including for functions whose DNS ingress is
    configured in HTTP mode.
  • The geo-routed DNS ingress is the function's invoke_url. It is on a
    different domain from this API, so it cannot be derived from the API host.
  • RPC-mode DNS ingress accepts POST at /. HTTP-mode DNS ingress accepts GET,
    HEAD, POST, PUT, PATCH, and DELETE at / and nested paths.
  • Direct and RPC-mode CORS preflight advertises POST, OPTIONS. HTTP-mode DNS
    preflight advertises GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS.
  • http_auth_mode: none applies only to public HTTP-mode DNS ingress; this
    direct operation always requires a Volcano credential.

Durable functions are not invocable here. A durable function's id
answers 404, whatever its visibility, because a synchronous call would
run it with no execution record, no idempotency and no concurrency
accounting. Start one with
POST /durable-functions/{functionId}/executions.
' to 'Invoke a function. The function's visibility decides which credentials
may call it, and the function does not run for any other. A private
function answers every credential but a service key exactly as a
missing one, with 404, so its name and id cannot be discovered; an anon
key on an authenticated function gets 403. An SDK calling by name
resolves it first through GET /functions/resolve, which answers that
anon key with 404 instead.

With Service Key (admin/background operations, every visibility):

  • Use for background jobs, webhooks, cron, admin operations
  • Function receives payload only (no user context)
  • Database queries bypass RLS (admin access)

With Auth User Token (user-facing, authenticated or public functions):

  • Use for user-initiated actions
  • Includes users from anonymous sign-ins
  • Function receives payload + __volcano_auth context:
    {
      user_id: "uuid",
      email: "user@example.com",
      project_id: "uuid",
      role: "authenticated" or "anonymous"
    }
  • Database queries enforce RLS (user-scoped data)

With Anon Key (public functions only):

  • Requires anon key permission: functions.invoke
  • Function must have visibility: public
  • Function receives payload only (no __volcano_auth)

Reserved payload keys: the top-level __volcano_auth and
__volcano_http keys are reserved. Volcano removes caller-supplied
values for both before the function runs; only an auth user token adds
a server-built __volcano_auth, and only HTTP-mode ingress sets
__volcano_http: true.

Transport and CORS:

  • This operation is the authenticated direct RPC endpoint and always uses the
    POST {payload: ...} contract, including for functions whose DNS ingress is
    configured in HTTP mode.
  • The geo-routed DNS ingress is the function's invoke_url. It is on a
    different domain from this API, so it cannot be derived from the API host.
  • RPC-mode DNS ingress accepts POST at /. HTTP-mode DNS ingress accepts GET,
    HEAD, POST, PUT, PATCH, and DELETE at / and nested paths.
  • Direct and RPC-mode CORS preflight advertises POST, OPTIONS. HTTP-mode DNS
    preflight advertises GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS.
  • http_auth_mode: none applies only to public HTTP-mode DNS ingress; this
    direct operation always requires a Volcano credential.

Durable functions are not invocable here. A durable function's id
answers 404, whatever its visibility, because a synchronous call would
run it with no execution record, no idempotency and no concurrency
accounting. Start one with
POST /durable-functions/{functionId}/executions.
'

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • Modified property: payload
              • Description changed from 'Payload to send to the function.

If invoked with auth user token, Volcano automatically injects __volcano_auth context:

{
  ...yourPayload,
  __volcano_auth: {
    user_id: "uuid",
    email: "user@example.com",
    project_id: "uuid",
    role: "authenticated" | "anonymous"
  }
}

' to 'Payload to send to the function.

If invoked with auth user token, Volcano automatically injects __volcano_auth context:

{
  ...yourPayload,
  __volcano_auth: {
    user_id: "uuid",
    email: "user@example.com",
    project_id: "uuid",
    role: "authenticated" | "anonymous"
  }
}

The top-level __volcano_auth and __volcano_http keys are reserved;
Volcano removes caller-supplied values for both.
'

GET /projects

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Properties changed
                    • Modified property: health
                    • Property 'AllOf' changed
                    • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

POST /projects

  • Responses changed
    • Modified response: 201
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

GET /projects/{id}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

PATCH /projects/{id}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

GET /projects/{id}/health

  • Description changed from 'Returns a fast control-plane health snapshot for the project and its
    deployed resources. The endpoint does not run live provider probes.
    A successful request returns 200 even when the project status is
    unhealthy; transport and authorization failures use HTTP errors.
    ' to 'Returns a fast control-plane health snapshot for the project and its
    deployed resources. The endpoint does not run live provider probes.
    A successful request returns 200 even when the project status is
    degraded or critical; transport and authorization failures use HTTP
    errors.
    '
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: checks
                • Items changed
                  • Properties changed
                    • Modified property: scope
                    • Properties changed
                    • Modified property: resource
                    • Properties changed
                    • Modified property: type
                    • New enum values: [database_branch]
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]
              • Modified property: findings
                • Items changed
                  • Properties changed
                    • Modified property: scope
                    • Properties changed
                    • Modified property: resource
                    • Properties changed
                    • Modified property: type
                    • New enum values: [database_branch]
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]
              • Modified property: status
                • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                • New enum values: [empty needs_attention]

DELETE /projects/{id}/logo

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

POST /projects/{id}/logo

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

POST /projects/{id}/sandbox-executions

  • Security changed
    • Deleted security requirements: ProjectAccessToken

GET /projects/{id}/sandbox-sessions

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /projects/{id}/sandbox-sessions

  • Security changed
    • Deleted security requirements: ProjectAccessToken

GET /projects/{id}/sandboxes

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /projects/{id}/sandboxes

  • Security changed
    • Deleted security requirements: ProjectAccessToken

DELETE /projects/{id}/sandboxes/{sandboxId}

  • Security changed
    • Deleted security requirements: ProjectAccessToken

GET /projects/{id}/sandboxes/{sandboxId}

  • Security changed
    • Deleted security requirements: ProjectAccessToken

PATCH /projects/{id}/sandboxes/{sandboxId}

  • Security changed
    • Deleted security requirements: ProjectAccessToken

GET /projects/{id}/sandboxes/{sandboxId}/deployments

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /projects/{id}/sandboxes/{sandboxId}/deployments

  • Security changed
    • Deleted security requirements: ProjectAccessToken

GET /projects/{id}/sandboxes/{sandboxId}/deployments/{deploymentId}

  • Security changed
    • Deleted security requirements: ProjectAccessToken

GET /projects/{id}/sandboxes/{sandboxId}/deployments/{deploymentId}/logs

  • Security changed
    • Deleted security requirements: ProjectAccessToken

GET /projects/{id}/sandboxes/{sandboxId}/deployments/{deploymentId}/source

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /projects/{id}/service-keys

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • Modified property: permissions
              • Description changed from 'Optional least-privilege scope for the key. When omitted, empty, or
                containing only blank strings, the key is granted full access ([""])
                for backward compatibility. Provide an explicit list (e.g.
                ["functions.invoke", "locks.manage"]) to restrict the key; "
                "
                grants everything. Scope enforcement applies to function invocation,
                storage object operations, and project locks.
                ' to 'Optional least-privilege scope for the key. When omitted, empty, or
                containing only blank strings, the key is granted full access ([""])
                for backward compatibility. Provide an explicit list (e.g.
                ["functions.invoke", "locks.manage"]) to restrict the key; "
                "
                grants everything. Scope enforcement applies to function invocation,
                storage object operations, project locks, and server-side auth proxy
                metadata (auth.signin, auth.signup, auth.refresh, auth.logout,
                auth.password_reset).
                '

DELETE /projects/{id}/storage/buckets/{bucketName}/policies/{policyId}

  • Responses changed
    • New response: 404

DELETE /sandbox-sessions/{sessionId}

  • Security changed
    • Deleted security requirements: ProjectAccessToken

GET /sandbox-sessions/{sessionId}

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /sandbox-sessions/{sessionId}/exec

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /sandbox-sessions/{sessionId}/files/read

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /sandbox-sessions/{sessionId}/files/write

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /sandbox-sessions/{sessionId}/resume

  • Security changed
    • Deleted security requirements: ProjectAccessToken

POST /sandbox-sessions/{sessionId}/suspend

  • Security changed
    • Deleted security requirements: ProjectAccessToken

Validation

@kong
kong Bot force-pushed the chore/sync-openapi branch from 7cd039d to b69cdc1 Compare August 28, 2026 13:58
@kong
kong Bot force-pushed the chore/sync-openapi branch 4 times, most recently from ebe76ec to 5660716 Compare August 30, 2026 12:25
@kong
kong Bot force-pushed the chore/sync-openapi branch from 5660716 to 697020d Compare September 10, 2026 22:00
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@kong
kong Bot force-pushed the chore/sync-openapi branch 13 times, most recently from ebaec87 to 2891cbb Compare September 17, 2026 18:04
@kong
kong Bot force-pushed the chore/sync-openapi branch 8 times, most recently from 2768536 to 0d69f5d Compare September 19, 2026 06:17
@kong
kong Bot force-pushed the chore/sync-openapi branch from 0d69f5d to b463e46 Compare October 5, 2026 22:54
@kong
kong Bot force-pushed the chore/sync-openapi branch 12 times, most recently from 35606b8 to 8fce68b Compare October 10, 2026 04:36

@marckong marckong left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: comment (don't merge as-is). The sync itself is correct and consistent with hosting 614aed52, and it keeps the durable-approvals operations intact. The generated contract change does expose two places where the hand-written SDK code no longer matches it (inline). Checked by reading the diff and the SDK source at this head; I did not run generation or tests locally. CI note: Quality Gate and Mutation Gate failed once on _durable_engine mutation and passed on rerun, which looks like a flake. Not checked: SDK-side validation of the widened timeout_seconds ranges.

Comment thread openapi/openapi.yaml Outdated
minimum: 30
maximum: 28800
description: Inherits the template TTL when omitted (3600 seconds for a new template).
idle_timeout_seconds:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] The SDK still sends idle_timeout_seconds, which the contract removes here.

CreateSandboxSessionRequest has additionalProperties: false upstream, and hosting #1743 removed the idle-timeout fields from the API and SDK bindings. Sandboxes.create in src/volcano_sdk/sandboxes.py:68 still loops over ("max_duration_seconds", "idle_timeout_seconds"), and SandboxCreateOptions still declares the field (sandbox_models.py:31).

Callers who pass it will have the request rejected by schema validation (exact status not confirmed). The bot's "Deleted Endpoints: None" report doesn't surface removed properties. Remove the option and the loop entry, and add a test, in a companion change landed with or before this PR.

memory_mb: int
created_at: datetime.datetime
expires_at: datetime.datetime
expires_at: datetime.datetime | None

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] expires_at is now nullable, but session decoding rejects null.

SandboxSession in sandbox_session.py:89 and _update at :166 apply timestamp() from _sandbox.py to expires_at. timestamp() is built to require an aware timestamp, so I expect it to raise on None. I only read its start, so this is inferred. The public property is typed datetime (:113).

Local mode with unlimited lifetime returns null, so creating, getting or refreshing such a session would fail. Cloud always returns an expiry, so it isn't affected. sandbox_id is also nullable now, but the SDK doesn't read it.

Hosting #1743 notes that published-client decoding wasn't validated. Make expires_at datetime | None and add a test.

@kong
kong Bot force-pushed the chore/sync-openapi branch 15 times, most recently from 91b486d to ae0ea59 Compare October 15, 2026 01:00
@kong
kong Bot force-pushed the chore/sync-openapi branch from ae0ea59 to 22f5e73 Compare October 15, 2026 01:50

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants