Armada Bridge Orchestrator API

GPUaaS Orchestrator API for the Armada Bridge platform. Handles tenants, clusters, VMs, storage, networking, catalogs, quotas, and related infrastructure operations. 189 operations across 33 tags, secured with JWT Bearer auth. servers[] is relative and must be prefixed with the per-deployment base URL.

OpenAPI Specification

armada-orchestrator-openapi-original.yml Raw ↑
openapi: 3.0.3
info:
  title: Orchestrator API
  description: |
    API for the GPUaaS Orchestrator microservice. Handles tenants, clusters, VMs,
    storage, networking, catalogs, quotas, and related infrastructure operations.
  version: 1.0.0
  contact:
    name: GPUaaS Platform

servers:
  - url: /
    description: Relative base (prefix with deployment base URL)

tags:
  - name: Health & Debug
  - name: Log Level
  - name: Tenants
  - name: Tenant Common Storage
  - name: Device Discovery
  - name: Infra Import
  - name: Monetize
  - name: NetQ
  - name: Models
  - name: Storage
  - name: Catalog
  - name: App Catalog
  - name: Metal
  - name: VMs
  - name: Network
  - name: Dashboard
  - name: CMS
  - name: Clusters
  - name: PaaS
  - name: Endpoints
  - name: Features
  - name: Servers
  - name: S3
  - name: Admin Settings
  - name: VPC
  - name: Security Groups
  - name: Templates
  - name: Quotas
  - name: Slurm
  - name: Load Balancers
  - name: Storage Classes
  - name: Datasets
  - name: Data Volumes

paths:
  /health-check:
    get:
      tags: [Health & Debug]
      summary: Health check
      operationId: getHealthCheck
      responses:
        "200":
          description: OK

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /debug/pprof/{profile}:
    get:
      tags: [Health & Debug]
      summary: pprof debug profiles
      parameters:
        - name: profile
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Profile data

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /log-level:
    get:
      tags: [Log Level]
      summary: Get current log level
      operationId: getLogLevel
      responses:
        "200":
          description: Current log level

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    post:
      tags: [Log Level]
      summary: Set log level
      operationId: setLogLevel
      responses:
        "200":
          description: Log level updated

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /log-level/debug:
    post:
      tags: [Log Level]
      summary: Enable debug logging
      operationId: enableDebug
      responses:
        "200":
          description: Debug enabled

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /log-level/info:
    post:
      tags: [Log Level]
      summary: Disable debug (set to info)
      operationId: disableDebug
      responses:
        "200":
          description: Debug disabled

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /tenants/common/storages:
    get:
      tags: [Tenant Common Storage]
      summary: List storage nodes (common/tenant context)
      operationId: fetchAllStorageNodesCommon
      responses:
        "200":
          description: List of storage nodes

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
  /tenants/common/storages/{storageNodeId}:
    get:
      tags: [Tenant Common Storage]
      summary: Get storage node by ID
      parameters:
        - name: storageNodeId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Storage node

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /device-discovery:
    get:
      tags: [Device Discovery]
      summary: Get topology
      operationId: getTopology
      responses:
        "200":
          description: Topology

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    post:
      tags: [Device Discovery]
      summary: Discover topology
      operationId: discoverTopology
      responses:
        "200":
          description: Discovery started/result

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /device-discovery-status:
    get:
      tags: [Device Discovery]
      summary: Get device discovery status
      operationId: getDeviceDiscoveryStatus
      responses:
        "200":
          description: Status

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /discovery-status:
    get:
      tags: [Device Discovery]
      summary: Get discovery status
      operationId: getDiscoveryStatus
      responses:
        "200":
          description: Status

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /infra/import:
    get:
      tags: [Infra Import]
      summary: Get all import infra
      operationId: getAllImportInfra
      responses:
        "200":
          description: List of import infra

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /infra/import/upload:
    post:
      tags: [Infra Import]
      summary: Import infra (upload)
      operationId: importInfraPost
      responses:
        "200":
          description: Import result

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'
    put:
      tags: [Infra Import]
      summary: Import infra (upload)
      operationId: importInfraPut
      responses:
        "200":
          description: Import result

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags: [Infra Import]
      summary: Delete import upload
      operationId: deleteImportInfraUpload
      responses:
        "200":
          description: Deleted

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "204":
          $ref: '#/components/responses/NoContent'

  /infra/import/compute:
    get:
      tags: [Infra Import]
      summary: Get all compute import infra
      operationId: getAllComputeImportInfra
      responses:
        "200":
          description: List of compute import infra

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /infra/import/compute/{id}:
    delete:
      tags: [Infra Import]
      summary: Delete import compute
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Deleted

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "204":
          $ref: '#/components/responses/NoContent'

  /infra/import/storage:
    get:
      tags: [Infra Import]
      summary: Get all storage import infra
      operationId: getAllStorageImportInfra
      responses:
        "200":
          description: List of storage import infra

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /infra/import/storage/{id}:
    delete:
      tags: [Infra Import]
      summary: Delete import storage
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Deleted

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "204":
          $ref: '#/components/responses/NoContent'

  /discoverytype:
    get:
      tags: [Infra Import]
      summary: Get discovery type
      operationId: getDiscoveryType
      responses:
        "200":
          description: Discovery type

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /monetize:
    post:
      tags: [Monetize]
      summary: Get monetize info
      operationId: getMonetizeInfo
      responses:
        "200":
          description: Monetize info

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /monetize/tenants/{tenantId}/users:
    post:
      tags: [Monetize]
      summary: Create monetize account user
      parameters:
        - name: tenantId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: User created

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'
    delete:
      tags: [Monetize]
      summary: Delete monetize account user
      parameters:
        - name: tenantId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Deleted

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "204":
          $ref: '#/components/responses/NoContent'

  /monetize/countries:
    get:
      tags: [Monetize]
      summary: Get supported countries
      operationId: getSupportedCountries
      responses:
        "200":
          description: List of countries

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /netq/servers:
    get:
      tags: [NetQ]
      summary: List NetQ servers
      operationId: getNetQServers
      responses:
        "200":
          description: List of NetQ servers

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    post:
      tags: [NetQ]
      summary: Onboard NetQ server
      operationId: onboardNetQServer
      responses:
        "200":
          description: Server onboarded

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /netq/servers/{id}:
    get:
      tags: [NetQ]
      summary: Get NetQ server by ID
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: NetQ server

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags: [NetQ]
      summary: Remove NetQ server
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Removed

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "204":
          $ref: '#/components/responses/NoContent'

  /netq/servers/{id}/notifications/subscribe:
    post:
      tags: [NetQ]
      summary: Subscribe to NetQ notifications
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Subscribed

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /netq/servers/{id}/notifications/unsubscribe:
    post:
      tags: [NetQ]
      summary: Unsubscribe from NetQ notifications
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Unsubscribed

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /netq/validate:
    post:
      tags: [NetQ]
      summary: Create topology validation
      operationId: createTopologyValidation
      responses:
        "200":
          description: Validation job created

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /netq/validate/{jobid}:
    get:
      tags: [NetQ]
      summary: Get topology validation status
      parameters:
        - name: jobid
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Validation status

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /tenants:
    get:
      tags: [Tenants]
      summary: List tenants
      operationId: getTenants
      responses:
        "200":
          description: List of tenants

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    post:
      tags: [Tenants]
      summary: Create tenant
      operationId: createTenant
      responses:
        "200":
          description: Tenant created

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /tenants/{tenant}:
    get:
      tags: [Tenants]
      summary: Get tenant
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Tenant

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags: [Tenants]
      summary: Delete tenant
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Deleted

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "204":
          $ref: '#/components/responses/NoContent'

  /tenants/{tenant}/models:
    get:
      tags: [Models]
      summary: Get models
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: List of models

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

  /tenants/{tenant}/model-deployments:
    get:
      tags: [Models]
      summary: List model deployments
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: List of model deployments

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    post:
      tags: [Models]
      summary: Create model deployment
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Model deployment created

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /tenants/{tenant}/model-deployments/{id}:
    get:
      tags: [Models]
      summary: Get model deployment
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Model deployment

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags: [Models]
      summary: Delete model deployment
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Deleted

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "204":
          $ref: '#/components/responses/NoContent'

  /tenants/{tenant}/storage:
    get:
      tags: [Storage]
      summary: Get all storages by tenant
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: List of storages

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    post:
      tags: [Storage]
      summary: Create storage
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Storage created

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /tenants/{tenant}/storage/{computeNodeName}:
    get:
      tags: [Storage]
      summary: Get storage by compute node name
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
        - name: computeNodeName
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Storage

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags: [Storage]
      summary: Delete storage
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
        - name: computeNodeName
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Deleted

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "204":
          $ref: '#/components/responses/NoContent'

  /tenants/{tenant}/storage/volumes:
    get:
      tags: [Storage]
      summary: Get volumes by tenant
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: List of volumes

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'
    post:
      tags: [Storage]
      summary: Create volume
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Volume created

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/components/responses/NotFound'
        "500":
          $ref: '#/components/responses/InternalServerError'

        "201":
          $ref: '#/components/responses/Created'
        "409":
          $ref: '#/components/responses/Conflict'

  /tenants/{tenant}/storage/volumes/{id}:
    get:
      tags: [Storage]
      summary: Get volume by ID
      parameters:
        - name: tenant
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Volume

        "400":
          $ref: '#/components/responses/BadRequest'
        "401":
          $ref: '#/components/responses/Unauthorized'
        "403":
          $ref: '#/components/responses/Forbidden'
        "404":
          $ref: '#/compone

# --- truncated at 32 KB (130 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/armada/refs/heads/main/openapi/armada-orchestrator-openapi-original.yml