From 17ab4a9b0e50b163826e2a3bef0a7b0f56077921 Mon Sep 17 00:00:00 2001 From: Angel Marin Date: Tue, 26 May 2026 09:01:17 +0200 Subject: [PATCH 1/2] HYPERFLEET-1103 - feat: restructure TypeSpec sources into core and shared - Move GCP-specific models out of this repo (now in hyperfleet-api-spec-gcp) - Restructure sources into core/ (core-specific) and shared/ (cross-provider) - Add generic Resource model and CRUD service (from main reconciliation) - Add force-delete endpoints for clusters, nodepools, and resources (internal) - Add ResourceStatusesInternal for adapter resource status reporting - Simplify build script: single provider (core only), openapi output only - Add npm sub-path exports to enable downstream package imports Co-Authored-By: Claude Sonnet 4.6 chore: fix CI/CD workflow path for version extraction main.tsp moved from core/main.tsp to root main.tsp as part of restructuring. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/ci.yml | 14 +- .github/workflows/release.yml | 14 +- CHANGELOG.md | 12 +- CLAUDE.md | 134 +- CONTRIBUTING.md | 129 +- README.md | 230 +- RELEASING.md | 15 +- aliases-core.tsp | 11 - aliases-gcp.tsp | 18 - aliases.tsp | 1 - build-schema.sh | 140 +- .../models}/cluster/example_cluster.tsp | 6 +- .../models}/cluster/example_patch.tsp | 4 +- .../models}/cluster/example_post.tsp | 4 +- .../models}/cluster/model.tsp | 2 +- .../models}/nodepool/example_nodepool.tsp | 6 +- .../models}/nodepool/example_patch.tsp | 4 +- .../models}/nodepool/example_post.tsp | 4 +- .../models}/nodepool/model.tsp | 2 +- .../services}/force-delete-internal.tsp | 2 +- .../services}/statuses-internal.tsp | 23 +- main.tsp | 22 +- models-gcp/channel/example_channel.tsp | 22 - models-gcp/channel/example_patch.tsp | 9 - models-gcp/channel/example_post.tsp | 11 - models-gcp/channel/model.tsp | 55 - models-gcp/cluster/example_cluster.tsp | 167 - models-gcp/cluster/example_patch.tsp | 28 - models-gcp/cluster/example_post.tsp | 30 - models-gcp/cluster/model.tsp | 40 - models-gcp/nodepool/example_nodepool.tsp | 175 - models-gcp/nodepool/example_patch.tsp | 29 - models-gcp/nodepool/example_post.tsp | 30 - models-gcp/nodepool/model.tsp | 40 - models-gcp/version/example_patch.tsp | 11 - models-gcp/version/example_post.tsp | 13 - models-gcp/version/example_version.tsp | 29 - models-gcp/version/model.tsp | 67 - models/compatibility/README.md | 6 - package-lock.json | 3229 +---------------- package.json | 16 +- schemas/core/openapi.yaml | 162 +- schemas/core/swagger.yaml | 2571 ------------- schemas/gcp/openapi.yaml | 2710 -------------- schemas/gcp/swagger.yaml | 2984 --------------- schemas/schemas.go | 6 +- services/channels.tsp | 89 - services/versions.tsp | 96 - {models => shared/models}/clusters/model.tsp | 5 +- {models => shared/models}/common/model.tsp | 1 + {models => shared/models}/nodepools/model.tsp | 5 +- .../models}/resource/example_patch.tsp | 0 .../models}/resource/example_post.tsp | 0 .../models}/resource/example_resource.tsp | 0 {models => shared/models}/resource/model.tsp | 0 .../statuses/example_adapter_status.tsp | 6 +- {models => shared/models}/statuses/model.tsp | 0 {services => shared/services}/clusters.tsp | 4 +- {services => shared/services}/nodepools.tsp | 6 +- {services => shared/services}/resources.tsp | 2 +- {services => shared/services}/statuses.tsp | 24 +- 61 files changed, 430 insertions(+), 13045 deletions(-) delete mode 100644 aliases-core.tsp delete mode 100644 aliases-gcp.tsp delete mode 120000 aliases.tsp rename {models-core => core/models}/cluster/example_cluster.tsp (97%) rename {models-core => core/models}/cluster/example_patch.tsp (58%) rename {models-core => core/models}/cluster/example_post.tsp (70%) rename {models-core => core/models}/cluster/model.tsp (88%) rename {models-core => core/models}/nodepool/example_nodepool.tsp (97%) rename {models-core => core/models}/nodepool/example_patch.tsp (58%) rename {models-core => core/models}/nodepool/example_post.tsp (68%) rename {models-core => core/models}/nodepool/model.tsp (88%) rename {services => core/services}/force-delete-internal.tsp (97%) rename {services => core/services}/statuses-internal.tsp (86%) delete mode 100644 models-gcp/channel/example_channel.tsp delete mode 100644 models-gcp/channel/example_patch.tsp delete mode 100644 models-gcp/channel/example_post.tsp delete mode 100644 models-gcp/channel/model.tsp delete mode 100644 models-gcp/cluster/example_cluster.tsp delete mode 100644 models-gcp/cluster/example_patch.tsp delete mode 100644 models-gcp/cluster/example_post.tsp delete mode 100644 models-gcp/cluster/model.tsp delete mode 100644 models-gcp/nodepool/example_nodepool.tsp delete mode 100644 models-gcp/nodepool/example_patch.tsp delete mode 100644 models-gcp/nodepool/example_post.tsp delete mode 100644 models-gcp/nodepool/model.tsp delete mode 100644 models-gcp/version/example_patch.tsp delete mode 100644 models-gcp/version/example_post.tsp delete mode 100644 models-gcp/version/example_version.tsp delete mode 100644 models-gcp/version/model.tsp delete mode 100644 models/compatibility/README.md delete mode 100644 schemas/core/swagger.yaml delete mode 100644 schemas/gcp/openapi.yaml delete mode 100644 schemas/gcp/swagger.yaml delete mode 100644 services/channels.tsp delete mode 100644 services/versions.tsp rename {models => shared/models}/clusters/model.tsp (97%) rename {models => shared/models}/common/model.tsp (99%) rename {models => shared/models}/nodepools/model.tsp (97%) rename {models => shared/models}/resource/example_patch.tsp (100%) rename {models => shared/models}/resource/example_post.tsp (100%) rename {models => shared/models}/resource/example_resource.tsp (100%) rename {models => shared/models}/resource/model.tsp (100%) rename {models => shared/models}/statuses/example_adapter_status.tsp (97%) rename {models => shared/models}/statuses/model.tsp (100%) rename {services => shared/services}/clusters.tsp (97%) rename {services => shared/services}/nodepools.tsp (96%) rename {services => shared/services}/resources.tsp (98%) rename {services => shared/services}/statuses.tsp (70%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f70281..f928b9d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,24 +24,20 @@ jobs: - name: Install dependencies run: npm ci - - name: Build all schemas - run: | - ./build-schema.sh core - ./build-schema.sh core --swagger - ./build-schema.sh gcp - ./build-schema.sh gcp --swagger + - name: Build core schema + run: ./build-schema.sh - name: Check schema consistency run: | if ! git diff --exit-code schemas/; then echo "Committed schemas are out of sync with TypeSpec sources." - echo "Run './build-schema.sh core --swagger && ./build-schema.sh gcp --swagger' and commit the results." + echo "Run './build-schema.sh' and commit the results." exit 1 fi - - name: Lint OpenAPI schemas + - name: Lint OpenAPI schema run: | - npx spectral lint schemas/core/openapi.yaml schemas/gcp/openapi.yaml --format github-actions --fail-severity warn + npx spectral lint schemas/core/openapi.yaml --format github-actions --fail-severity warn - name: Check version bump env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d1f9bb6..8e44998 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,21 +49,14 @@ jobs: echo "skip=false" >> "$GITHUB_OUTPUT" fi - - name: Build all schemas + - name: Build core schema if: steps.check_tag.outputs.skip == 'false' - run: | - ./build-schema.sh core - ./build-schema.sh core --swagger - ./build-schema.sh gcp - ./build-schema.sh gcp --swagger + run: ./build-schema.sh - name: Prepare release assets if: steps.check_tag.outputs.skip == 'false' run: | cp schemas/core/openapi.yaml core-openapi.yaml - cp schemas/core/swagger.yaml core-swagger.yaml - cp schemas/gcp/openapi.yaml gcp-openapi.yaml - cp schemas/gcp/swagger.yaml gcp-swagger.yaml - name: Create release tag if: steps.check_tag.outputs.skip == 'false' @@ -85,8 +78,5 @@ jobs: prerelease: false files: | core-openapi.yaml - core-swagger.yaml - gcp-openapi.yaml - gcp-swagger.yaml env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c1e273..4ab4d7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.0.18] - 2026-05-26 + +### Changed + +- Restructured TypeSpec sources into `core/` and `shared/` directories (HYPERFLEET-1103) +- Removed GCP provider from core repository; GCP contracts now live in a dedicated `hyperfleet-api-spec-gcp` repository (HYPERFLEET-1103) +- `build-schema.sh` simplified: no provider argument required, generates core OpenAPI only +- CI/CD workflows updated to reflect new `main.tsp` location at repository root + ## [1.0.17] - 2026-05-21 ### Added @@ -170,7 +179,8 @@ First official stable release of the HyperFleet API specification. - Interactive API documentation -[Unreleased]: https://github.com/openshift-hyperfleet/hyperfleet-api-spec/compare/v1.0.17...HEAD +[Unreleased]: https://github.com/openshift-hyperfleet/hyperfleet-api-spec/compare/v1.0.18...HEAD +[1.0.18]: https://github.com/openshift-hyperfleet/hyperfleet-api-spec/compare/v1.0.17...v1.0.18 [1.0.17]: https://github.com/openshift-hyperfleet/hyperfleet-api-spec/compare/v1.0.16...v1.0.17 [1.0.16]: https://github.com/openshift-hyperfleet/hyperfleet-api-spec/compare/v1.0.15...v1.0.16 [1.0.15]: https://github.com/openshift-hyperfleet/hyperfleet-api-spec/compare/v1.0.14...v1.0.15 diff --git a/CLAUDE.md b/CLAUDE.md index 3b341b0..fc6237d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,52 +1,43 @@ # HyperFleet API Spec - AI Agent Context -This repository generates OpenAPI specifications from TypeSpec definitions. It supports multiple provider variants (core, GCP) using a shared codebase with provider-specific type aliases. +This repository generates the HyperFleet core OpenAPI specification from TypeSpec definitions. The GCP-specific contract lives in [hyperfleet-api-spec-gcp](https://github.com/openshift-hyperfleet/hyperfleet-api-spec-gcp), which imports shared models from this repo as the `hyperfleet` npm package. ## Quick Reference **Build commands:** ```bash -npm run build:core # Generate core OpenAPI spec -npm run build:gcp # Generate GCP OpenAPI spec -npm run build:all # Generate all variants with Swagger +npm run build # Generate core OpenAPI spec +./build-schema.sh # Same, via script directly ``` **Validation workflow:** ```bash npm install # Install dependencies -./build-schema.sh gcp # Build GCP OpenAPI 3.0 -./build-schema.sh gcp --swagger # Build GCP OpenAPI 2.0 (Swagger) -./build-schema.sh core # Build core OpenAPI 3.0 -./build-schema.sh core --swagger # Build core OpenAPI 2.0 (Swagger) -ls -l schemas/*/openapi.yaml # Confirm outputs exist +./build-schema.sh # Build core OpenAPI 3.0 +ls -l schemas/core/openapi.yaml # Confirm output exists ``` ## Key Concepts -### Provider Variants via Aliases +### Repository Layout -The repo uses a single `main.tsp` but generates different specs per provider: - -```typescript -// aliases-core.tsp -alias ClusterSpec = Record; // Generic - -// aliases-gcp.tsp -alias ClusterSpec = GCPClusterSpec; // Provider-specific ``` - -The `aliases.tsp` symlink determines which provider types are active. The `build-schema.sh` script automatically re-links this during builds. The symlink is tracked in git and should always point to `aliases-core.tsp` by default. Do not remove it from version control or add it to `.gitignore`. +shared/ # Cross-provider models and services (published as the `hyperfleet` npm package) +core/ # Core-only models and internal services +main.tsp # Entry point — imports shared + core +schemas/core/ # Generated output (committed) +``` **When adding new models:** -- Shared models → `models/` -- Provider-specific → `models-{provider}/` -- Always update alias files if you introduce provider-specific types +- Cross-provider models → `shared/models/` +- Core-only models → `core/models/` +- GCP-specific → separate repo (`hyperfleet-api-spec-gcp`) ### Public vs Internal APIs Status endpoints are split: -- `services/statuses.tsp` - GET operations (external clients) -- `services/statuses-internal.tsp` - PUT operations (internal adapters only) +- `shared/services/statuses.tsp` - GET operations (external clients) +- `core/services/statuses-internal.tsp` - PUT operations (internal adapters only) and resource force-delete The split allows generating different API contracts per audience. Only `statuses.tsp` is imported by default. @@ -54,7 +45,7 @@ The split allows generating different API contracts per audience. Only `statuses ### TypeSpec Conventions -**Imports first, namespace second:** +**Imports first, namespace second** (applies to service and model files; example `const` files do not declare a namespace): ```typescript import "@typespec/http"; import "../models/common/model.tsp"; @@ -79,33 +70,30 @@ interface Clusters { ### File Organization ``` -models/{resource}/ +shared/models/{resource}/ ├── model.tsp # Shared model definitions └── interfaces.tsp # Optional: shared interfaces -models-{provider}/{resource}/ - └── model.tsp # Provider-specific models +shared/services/ + └── {resource}.tsp # Shared service endpoints -services/ - └── {resource}.tsp # Service endpoints +core/models/{resource}/ + └── model.tsp # Core-specific models + +core/services/ + └── {resource}-internal.tsp # Internal-only endpoints ``` ## Boundaries **DO NOT:** -- Modify generated files in `schemas/` or `tsp-output/` directly +- Modify generated files in `schemas/` or `tsp-output-core/` directly - Add dependencies without checking TypeSpec version compatibility - Auto-generate documentation - it degrades agent performance per research -- Use `--swagger` flag unless you need OpenAPI 2.0 for legacy tools - Commit `node_modules/` or build artifacts **DO:** -- Run builds in this order before committing schema changes: - 1. `./build-schema.sh gcp` - 2. `./build-schema.sh gcp --swagger` - 3. `./build-schema.sh core` - 4. `./build-schema.sh core --swagger` -- Test both provider variants when modifying shared models +- Run `./build-schema.sh` and commit `schemas/core/openapi.yaml` with your changes - Keep TypeSpec files focused (one resource per service file) - Use semantic versioning for releases (automated on merge to main) @@ -114,7 +102,7 @@ services/ ### Add a new endpoint to existing service ```typescript -// services/clusters.tsp +// shared/services/clusters.tsp namespace HyperFleet; @route("/clusters") @@ -131,7 +119,7 @@ interface Clusters { 1. Create model: ```typescript -// models/health/model.tsp +// shared/models/health/model.tsp import "@typespec/http"; model HealthStatus { @@ -143,7 +131,7 @@ model HealthStatus { 2. Create service: ```typescript -// services/health.tsp +// shared/services/health.tsp import "@typespec/http"; import "../models/health/model.tsp"; import "../models/common/model.tsp"; @@ -158,35 +146,14 @@ interface Health { 3. Import in `main.tsp`: ```typescript -import "./services/health.tsp"; +import "./shared/services/health.tsp"; ``` -4. Build: `npm run build:core` +4. Build: `npm run build` ### Add provider-specific fields -```typescript -// models-gcp/cluster/model.tsp -model GCPClusterSpec { - projectId: string; - region: string; - network?: GCPNetwork; -} - -model GCPNetwork { - vpcId: string; - subnetId: string; -} -``` - -Update alias: -```typescript -// aliases-gcp.tsp -import "./models-gcp/cluster/model.tsp"; -alias ClusterSpec = GCPClusterSpec; -``` - -Build: `npm run build:gcp` +Provider-specific models live in the provider's own repository (e.g., `hyperfleet-api-spec-gcp`). See that repo for examples of how to extend core shared models. ## Version Bump and Changelog @@ -202,36 +169,29 @@ When bumping the version in `main.tsp`, always update `CHANGELOG.md`: Before submitting changes: - [ ] Dependencies installed: `npm install` -- [ ] GCP variant builds: `./build-schema.sh gcp` -- [ ] GCP Swagger builds: `./build-schema.sh gcp --swagger` -- [ ] Core variant builds: `./build-schema.sh core` -- [ ] Core Swagger builds: `./build-schema.sh core --swagger` -- [ ] Schema files generated: `ls schemas/*/openapi.yaml` +- [ ] Core schema builds: `./build-schema.sh` +- [ ] Schema file generated: `ls schemas/core/openapi.yaml` - [ ] No TypeSpec compilation errors (check output) -- [ ] Schemas pass linting: `spectral lint schemas/core/openapi.yaml schemas/gcp/openapi.yaml` -- [ ] Changes committed including schema updates +- [ ] Schema passes linting: `spectral lint schemas/core/openapi.yaml` +- [ ] Changes committed including schema update - [ ] PR description references related issue ## Build System Details **The build-schema.sh script:** -1. Validates provider parameter (core, gcp, etc.) -2. Re-links `aliases.tsp` → `aliases-{provider}.tsp` -3. Runs `node_modules/.bin/tsp compile main.tsp` -4. Copies output to `schemas/{provider}/openapi.yaml` -5. (Optional) Converts to OpenAPI 2.0 with `--swagger` flag +1. Extracts the version from `main.tsp` and syncs it into `package.json` +2. Runs `node_modules/.bin/tsp compile main.tsp --output-dir tsp-output-core` +3. Moves output to `schemas/core/openapi.yaml` **Output locations:** -- TypeSpec: `tsp-output/schema/openapi.yaml` (temporary) -- Final: `schemas/{provider}/openapi.yaml` (committed) +- TypeSpec temp: `tsp-output-core/schema/openapi.yaml` (auto-deleted) +- Final: `schemas/core/openapi.yaml` (committed) -## VS Code Extension Notes +**Version sync:** `package.json` version is kept in lockstep with `main.tsp` automatically on every build. The CI consistency check (`git diff --exit-code`) enforces that both are committed together. -The TypeSpec extension may show false errors: -- Non-active provider models appear undefined (expected) -- Duplicate type warnings from multiple alias files (expected) +## VS Code Extension Notes -Both the CLI and "Emit from TypeSpec" command work correctly despite warnings. +The TypeSpec extension may show false errors for models resolved only at compile time. Both the CLI and "Emit from TypeSpec" command work correctly. ## Dependencies @@ -257,9 +217,9 @@ Releases are **fully automated** via GitHub Actions (`.github/workflows/release. On every push to `main`, the release workflow: 1. Extracts the version from the `@info` decorator in `main.tsp` 2. Skips if a tag for that version already exists -3. Builds all four schema variants (core/gcp OpenAPI 3.0 + Swagger 2.0) +3. Builds the core OpenAPI schema 4. Creates an annotated Git tag (`vX.Y.Z`) -5. Publishes a GitHub Release with all four artifacts attached +5. Publishes a GitHub Release with `core-openapi.yaml` attached The CI workflow (`.github/workflows/ci.yml`) enforces that the version in `main.tsp` is bumped from the latest release tag before a PR can be merged. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 929c5ac..aef6002 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,11 +26,10 @@ Thank you for your interest in contributing to the HyperFleet API specification! npm install ``` -3. Verify your setup by building the schemas: +3. Verify your setup by building the schema: ```bash - npm run build:core - npm run build:gcp + npm run build ``` ## Repository Structure @@ -38,74 +37,59 @@ Thank you for your interest in contributing to the HyperFleet API specification! ``` hyperfleet-api-spec/ ├── main.tsp # Main TypeSpec entry point -├── aliases.tsp # Active provider aliases (symlink) -├── aliases-core.tsp # Core provider aliases -├── aliases-gcp.tsp # GCP provider aliases -├── tspconfig.yaml # TypeSpec compiler configuration -├── build-schema.sh # Build script for OpenAPI generation -├── models/ # Shared models for all providers -│ ├── clusters/ # Cluster resource definitions -│ ├── nodepools/ # NodePool resource definitions -│ ├── statuses/ # Status resource definitions -│ └── common/ # Common types and models -├── models-core/ # Core provider-specific models -├── models-gcp/ # GCP provider-specific models -├── services/ # Service definitions -│ ├── clusters.tsp # Cluster endpoints -│ ├── nodepools.tsp # NodePool endpoints -│ ├── statuses.tsp # Status read endpoints (public) -│ └── statuses-internal.tsp # Status write endpoints (internal) -└── schemas/ # Generated OpenAPI outputs - ├── core/ - └── gcp/ +├── tspconfig.yaml # TypeSpec compiler configuration +├── build-schema.sh # Build script for OpenAPI generation +├── shared/ # Models and services shared across providers +│ ├── models/ +│ │ ├── clusters/ # Cluster resource definitions +│ │ ├── nodepools/ # NodePool resource definitions +│ │ ├── statuses/ # Status resource definitions +│ │ ├── resource/ # Generic Resource type +│ │ └── common/ # Common types and models +│ └── services/ # Shared service endpoints +├── core/ # Core-specific models and internal services +│ ├── models/ +│ │ └── cluster/ # CoreClusterSpec (Record) +│ └── services/ +│ ├── statuses-internal.tsp # Status write endpoints (internal) +│ └── force-delete-internal.tsp # Force-delete endpoints (internal) +└── schemas/ # Generated OpenAPI output + └── core/ + └── openapi.yaml ``` ## Testing -### Building Schemas +### Building Schema -Test your changes by building the OpenAPI schemas: +Test your changes by building the OpenAPI schema: ```bash -# Build individual variants -npm run build:core -npm run build:gcp - -# Build with Swagger (OpenAPI 2.0) output -npm run build:core:swagger -npm run build:gcp:swagger - -# Build all variants -npm run build:all +npm run build ``` -### Linting Schemas +### Linting Schema -CI automatically lints OpenAPI schemas using a pinned version of [Spectral](https://github.com/stoplightio/spectral) installed locally in the workflow. For local linting during development, install Spectral globally: +CI automatically lints the OpenAPI schema using a pinned version of [Spectral](https://github.com/stoplightio/spectral) installed locally in the workflow. For local linting during development, install Spectral globally: ```bash npm install -g @stoplight/spectral-cli ``` -Then lint the generated schemas: +Then lint the generated schema: ```bash -spectral lint schemas/core/openapi.yaml schemas/gcp/openapi.yaml +spectral lint schemas/core/openapi.yaml ``` The `.spectral.yaml` config at the repo root applies the `spectral:oas` ruleset. ### Validating Output -After building, verify the generated schemas: +After building, verify the generated schema: ```bash -# Check that files were generated ls -l schemas/core/openapi.yaml -ls -l schemas/gcp/openapi.yaml - -# Review the generated OpenAPI for your changes -cat schemas/core/openapi.yaml ``` ### Visual Studio Code Extension @@ -136,14 +120,14 @@ The VSCode extension has a nice feature when doing right click on the main.tsp a ``` 2. Import in `main.tsp` if needed -3. Build and verify: `npm run build:core` +3. Build and verify: `npm run build` ### Adding a New Service Endpoint -1. Create or edit a service file in `services/`: +1. Create or edit a service file in `shared/services/` (for shared endpoints) or `core/services/` (for internal-only endpoints): ```typescript - // services/newservice.tsp + // shared/services/newservice.tsp import "@typespec/http"; import "@typespec/openapi"; import "../models/common/model.tsp"; @@ -159,53 +143,14 @@ The VSCode extension has a nice feature when doing right click on the main.tsp a 2. Import in `main.tsp`: ```typescript - import "./services/newservice.tsp"; + import "./shared/services/newservice.tsp"; ``` -3. Build and verify: `npm run build:all` +3. Build and verify: `npm run build` ### Adding a New Provider -1. Create provider model directory: - - ```bash - mkdir -p models-aws/cluster - ``` - -2. Define provider-specific models: - - ```typescript - // models-aws/cluster/model.tsp - model AWSClusterSpec { - awsProperty1: string; - awsProperty2: string; - } - ``` - -3. Create provider aliases file: - - ```typescript - // aliases-aws.tsp - import "./models-aws/cluster/model.tsp"; - alias ClusterSpec = AWSClusterSpec; - ``` - -4. Update `build-schema.sh` to support the new provider (it auto-detects) -5. Build: `./build-schema.sh aws` - -### Switching Between Providers in VS Code - -The `aliases.tsp` symlink controls which provider is active: - -```bash -# Work on Core API -ln -sf aliases-core.tsp aliases.tsp - -# Work on GCP API -ln -sf aliases-gcp.tsp aliases.tsp -``` - -The VS Code extension uses whichever provider `aliases.tsp` points to. +Provider-specific contracts live in their own repository and import `shared/` models via the `hyperfleet` npm package. See [hyperfleet-api-spec-gcp](https://github.com/openshift-hyperfleet/hyperfleet-api-spec-gcp) for a reference implementation. ## Commit Standards @@ -228,7 +173,7 @@ When a PR is merged to `main`, the release workflow automatically: 1. Extracts the version from `main.tsp` 2. Creates an annotated Git tag -3. Publishes a GitHub Release with all four schema artifacts attached +3. Publishes a GitHub Release with `core-openapi.yaml` attached The CI workflow enforces that the version in `main.tsp` is bumped from the latest release tag before a PR can be merged. @@ -236,7 +181,7 @@ The CI workflow enforces that the version in `main.tsp` is bumped from the lates 1. Create a feature branch: `git checkout -b feature/my-feature` 2. Make your changes -3. Build and test: `npm run build:all` +3. Build and test: `npm run build` 4. Commit with conventional commit message 5. Push to your fork 6. Create a Pull Request diff --git a/README.md b/README.md index 70a43f3..4e7a6b3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This repository supports the development of the Hyperfleet OpenAPI contract, but is not the source-of-truth for the OpenAPI contract. -This project hosts the TypeSpec files to generate the HyperFleet OpenAPI specifications. Typescpec is an implementation detail providing better ergonomics than writing contracts in plain YAML, specially when dealing with contract variants that we need to keep aligned. The repository is organized to support multiple service variants (core, GCP, etc.) while sharing common models and interfaces. +This project hosts the TypeSpec files to generate the HyperFleet core OpenAPI specification. TypeSpec is an implementation detail providing better ergonomics than writing contracts in plain YAML. The repository generates the core provider contract; the GCP-specific contract lives in [hyperfleet-api-spec-gcp](https://github.com/openshift-hyperfleet/hyperfleet-api-spec-gcp). Access to the OpenAPI contract source of truth in hyperfleet-api repository: @@ -11,7 +11,6 @@ Access to the OpenAPI contract source of truth in hyperfleet-api repository: Access directly to the latest generated contract in this repository: - core: -- GCP: ## Consuming the API Specifications @@ -32,29 +31,20 @@ curl -L -O https://github.com/openshift-hyperfleet/hyperfleet-api/releases/lates Download the latest stable OpenAPI specifications directly from GitHub Releases: -**Direct URLs** (always get the latest stable version): +**Direct URL** (always gets the latest stable version): - Core: `https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/latest/download/core-openapi.yaml` -- GCP: `https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/latest/download/gcp-openapi.yaml` -**Download examples**: +**Download example**: ```bash -# Core API curl -L -O https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/latest/download/core-openapi.yaml - -# GCP API -curl -L -O https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/latest/download/gcp-openapi.yaml ``` **Use in code generation** (always uses latest stable version): ```bash -# Generate Go client from Core API openapi-generator generate -i https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/latest/download/core-openapi.yaml -g go -o ./client - -# Generate Python client from GCP API -openapi-generator generate -i https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/latest/download/gcp-openapi.yaml -g python -o ./client ``` ### Version-Specific Downloads @@ -62,56 +52,38 @@ openapi-generator generate -i https://github.com/openshift-hyperfleet/hyperfleet To download a specific version (e.g., v1.0.0): ```bash -# Core API curl -L -O https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/download/v1.0.0/core-openapi.yaml - -# GCP API -curl -L -O https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/download/v1.0.0/gcp-openapi.yaml ``` **See all releases**: ## Repository Structure -The repository is organized with root-level configuration files and three main directories: +The repository is organized with root-level configuration files and two main directories: ### Root-Level Files - **`main.tsp`** - Main TypeSpec entry point that imports all service definitions -- **`aliases.tsp`** - Provider alias configuration file (re-linked to switch between providers) -- **`aliases-core.tsp`** - Core provider aliases (defines `ClusterSpec` as `CoreClusterSpec` which is `Record`) -- **`aliases-gcp.tsp`** - GCP provider aliases (defines `ClusterSpec` as `GCPClusterSpec`) - **`tspconfig.yaml`** - TypeSpec compiler configuration -### `/models` - -Contains shared models used by all service variants: - -- **`models/clusters/`** - Cluster resource definitions (interfaces and base models) -- **`models/statuses/`** - Status resource definitions for clusters and nodepools -- **`models/nodepools/`** - NodePool resource definitions -- **`models/common/`** - Common models and types (APIResource, Error, QueryParams, etc.) - -### `/models-core` - -Contains core provider-specific model definitions: - -- **`models-core/cluster/model.tsp`** - Defines `CoreClusterSpec` as `Record` (generic) +### `/shared` -### `/models-gcp` +Contains models and services shared across providers (also published as an npm package for consumption by provider-specific repos like `hyperfleet-api-spec-gcp`): -Contains GCP provider-specific model definitions: +- **`shared/models/clusters/`** - Cluster resource definitions (interfaces and base models) +- **`shared/models/statuses/`** - Status resource definitions for clusters and nodepools +- **`shared/models/nodepools/`** - NodePool resource definitions +- **`shared/models/resource/`** - Generic Resource type for non-cluster entity types +- **`shared/models/common/`** - Common models and types (APIMetadata, Error, QueryParams, etc.) +- **`shared/services/`** - Shared service endpoints (clusters, nodepools, statuses, resources) -- **`models-gcp/cluster/model.tsp`** - Defines `GCPClusterSpec` with GCP-specific properties +### `/core` -### `/services` +Contains core-specific models and internal services: -Contains service definitions that generate the OpenAPI specifications: - -- **`services/clusters.tsp`** - Cluster resource endpoints -- **`services/statuses.tsp`** - Status resource endpoints (GET only - public API) -- **`services/statuses-internal.tsp`** - Status write endpoints (PUT - internal API, see below) -- **`services/nodepools.tsp`** - NodePool resource endpoints +- **`core/models/cluster/`** - Core cluster spec (`CoreClusterSpec` as `Record`) +- **`core/services/statuses-internal.tsp`** - Status write endpoints (PUT - internal adapters only) +- **`core/services/force-delete-internal.tsp`** - Force-delete endpoints (internal only) #### Public vs Internal API Split @@ -119,8 +91,8 @@ The status endpoints are split into two files to support different API consumers | File | Operations | Audience | Included in Build | |------|------------|----------|-------------------| -| `statuses.tsp` | GET (read) | External clients | ✅ Yes (default) | -| `statuses-internal.tsp` | PUT (write) | Internal adapters | ❌ No (opt-in) | +| `shared/services/statuses.tsp` | GET (read) | External clients | ✅ Yes (default) | +| `core/services/statuses-internal.tsp` | PUT (write) | Internal adapters | ❌ No (opt-in) | **Why the split?** @@ -140,111 +112,33 @@ This installs the TypeSpec compiler and all required libraries into `node_module ## Building OpenAPI Specifications -The repository uses a single `main.tsp` entry point. To generate either the core API or GCP API, you need to re-link the `aliases.tsp` file to point to the desired provider aliases file. - -### Output Formats - -The build system supports two OpenAPI formats: - -- **OpenAPI 3.0** (default) - Modern format with full feature support -- **OpenAPI 2.0 (Swagger)** - Legacy format for compatibility with older tools +The repository uses a single `main.tsp` entry point. ### Using npm Scripts (Recommended) -The easiest way to build the OpenAPI schema is using the provided npm scripts: - ```bash -# Build OpenAPI 3.0 only -npm run build:core # Build Core API (OpenAPI 3.0) -npm run build:gcp # Build GCP API (OpenAPI 3.0) - -# Build both OpenAPI 3.0 and OpenAPI 2.0 (Swagger) -npm run build:core:swagger # Build Core API with Swagger -npm run build:gcp:swagger # Build GCP API with Swagger - -# Build all providers with both formats -npm run build:all +npm run build ``` ### Using the Build Script Directly -You can also use the `build-schema.sh` script directly: - ```bash -# Build OpenAPI 3.0 only -./build-schema.sh core -./build-schema.sh gcp - -# Build with OpenAPI 2.0 (Swagger) output -./build-schema.sh core --swagger -./build-schema.sh gcp --swagger -# or use the alias: -./build-schema.sh gcp --openapi2 +./build-schema.sh ``` -The script automatically: +The script: -1. Validates the provider parameter -2. Re-links `aliases.tsp` to the appropriate provider aliases file -3. Compiles the TypeSpec to generate the OpenAPI 3.0 schema -4. (If `--swagger` flag is used) Converts OpenAPI 3.0 to OpenAPI 2.0 (Swagger) -5. Outputs the results to `schemas/{provider}/`: - - `openapi.yaml` - OpenAPI 3.0 specification - - `swagger.yaml` - OpenAPI 2.0 (Swagger) specification (if `--swagger` flag is used) - -**Extending to new providers**: Simply create `aliases-{provider}.tsp` and the script will automatically detect and support it. +1. Syncs `package.json` version from `main.tsp` +2. Compiles the TypeSpec from `main.tsp` +3. Outputs `schemas/core/openapi.yaml` ### Manual Build (Alternative) -If you prefer to build manually: - -#### Build Core API - -1. Re-link `aliases.tsp` to `aliases-core.tsp`: - - ```bash - ln -sf aliases-core.tsp aliases.tsp - ``` - -2. Compile the TypeSpec: - - ```bash - tsp compile main.tsp - ``` - - Output: `tsp-output/schema/openapi.yaml` - -3. (Optional) Convert to OpenAPI 2.0 (Swagger): - - ```bash - npx api-spec-converter --from=openapi_3 --to=swagger_2 --syntax=yaml \ - tsp-output/schema/openapi.yaml > tsp-output/schema/swagger.yaml - ``` - -#### Build GCP API - -1. Re-link `aliases.tsp` to `aliases-gcp.tsp`: - - ```bash - ln -sf aliases-gcp.tsp aliases.tsp - ``` - -2. Compile the TypeSpec: - - ```bash - tsp compile main.tsp - ``` - - Output: `tsp-output/schema/openapi.yaml` - -3. (Optional) Convert to OpenAPI 2.0 (Swagger): - - ```bash - npx api-spec-converter --from=openapi_3 --to=swagger_2 --syntax=yaml \ - tsp-output/schema/openapi.yaml > tsp-output/schema/swagger.yaml - ``` +```bash +node_modules/.bin/tsp compile main.tsp +``` -**Note**: The `aliases.tsp` file controls which provider-specific `ClusterSpec` definition is used throughout the service definitions. By re-linking it to either `aliases-core.tsp` or `aliases-gcp.tsp`, you switch between the generic `Record` spec and the GCP-specific `GCPClusterSpec`. +Output: `tsp-output-core/schema/openapi.yaml` ## Architecture @@ -255,30 +149,7 @@ The HyperFleet API provides simple CRUD operations for managing cluster resource ## Adding a New Provider -To add a new provider (e.g., AWS): - -1. Create provider model directory: `models-aws/cluster/model.tsp` - - ```typescript - model AWSClusterSpec { - awsProperty1: string; - awsProperty2: string; - } - ``` - -2. Create provider aliases file: `aliases-aws.tsp` - - ```typescript - import "./models-aws/cluster/model.tsp"; - alias ClusterSpec = AWSClusterSpec; - ``` - -3. To generate the AWS API, re-link `aliases.tsp`: - - ```bash - ln -sf aliases-aws.tsp aliases.tsp - tsp compile main.tsp - ``` +Provider-specific contracts live in their own repository and consume this repo as an npm package (the `hyperfleet` package). See [hyperfleet-api-spec-gcp](https://github.com/openshift-hyperfleet/hyperfleet-api-spec-gcp) for a reference implementation. ## Adding a New Service @@ -311,37 +182,35 @@ To add a new service (e.g., with additional endpoints): - `@typespec/http` - HTTP protocol support - `@typespec/openapi` - OpenAPI decorators - `@typespec/openapi3` - OpenAPI 3.0 emitter -- `api-spec-converter` - Converts OpenAPI 3.0 to OpenAPI 2.0 (Swagger) ## Updating the Specification ### Making an API change -1. **Edit the TypeSpec sources** in `models/`, `models-gcp/`, or `services/`. +1. **Edit the TypeSpec sources** in `shared/` or `core/`. 2. **Bump the version** in `main.tsp`: ```typescript - @info(#{ version: "1.0.12", ... }) + @info(#{ version: "1.0.19", ... }) ``` -3. **Rebuild all four schemas**: +3. **Rebuild the schema**: ```bash - ./build-schema.sh core - ./build-schema.sh core --swagger - ./build-schema.sh gcp - ./build-schema.sh gcp --swagger + ./build-schema.sh ``` + This also updates `package.json` version automatically — no need to edit it manually. + 4. **Update [CHANGELOG.md](CHANGELOG.md)** — move your changes from `[Unreleased]` into a new versioned entry. 5. **Open a PR.** CI enforces three things automatically: - - Committed schemas match freshly generated output (catches manual edits or forgotten rebuilds). - - OpenAPI 3.0 schemas pass `spectral:oas` linting. + - Committed schema and `package.json` match freshly generated output (catches manual edits or forgotten rebuilds). + - OpenAPI 3.0 schema passes `spectral:oas` linting. - Version in `main.tsp` is higher than the latest GitHub release tag. -6. **Merge to main.** The release workflow runs automatically: it creates an annotated tag (`vX.Y.Z`), builds all four schemas from scratch, and publishes a GitHub release with the artifacts attached. +6. **Merge to main.** The release workflow runs automatically: it creates an annotated tag (`vX.Y.Z`), builds the schema from scratch, and publishes a GitHub release with `core-openapi.yaml` attached. ### Consuming schemas as a Go module @@ -350,13 +219,13 @@ Each release tag is a valid Go module version. Import the embedded schemas: ```go import specschemas "github.com/openshift-hyperfleet/hyperfleet-api-spec/schemas" -data, err := specschemas.FS.ReadFile("gcp/openapi.yaml") +data, err := specschemas.FS.ReadFile("core/openapi.yaml") ``` To update a consumer after a new release: ```bash -go get github.com/openshift-hyperfleet/hyperfleet-api-spec@v1.0.12 +go get github.com/openshift-hyperfleet/hyperfleet-api-spec@v1.0.18 ``` To test locally against an unreleased branch, use a `replace` directive in your `go.mod`: @@ -377,17 +246,6 @@ We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for: - Commit standards - Pull request process -## Developing with the Visual Studio Typespec extension - -The repository works with different contracts (core and GCP) but a single Typespec `main.tsp`. -This is accomplished by maintaining an `aliases.tsp` file that holds the "active" concrete types to use (core or GCP). - -- When working on the core API, the `aliases.tsp` points to `aliases-core.tsp` -- When working on the GCP API, the `aliases.tsp` points to `aliases-gcp.tsp` - -The downside of this is that it confuses the Typespec extension: - -- For the "non-active" type files, the plugin may show errors as not defined types -- Since we duplicate aliases, the plugin may display an error of a type being duplicated +## Developing with the Visual Studio TypeSpec extension -But, both the `build-schema.sh` script using the `tsp` CLI command as the plugin option to "Emit from Typespec" work fine. +This repository compiles a single `main.tsp` entry point for the core contract. The TypeSpec extension may show false errors for models in `shared/` that are only resolved at compile time, but both `build-schema.sh` and the "Emit from TypeSpec" command work correctly. diff --git a/RELEASING.md b/RELEASING.md index 55ea408..69014b6 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -24,8 +24,8 @@ Examples: 1. Bump the version in `main.tsp` (the `@info` decorator's `version` field) 2. Update `CHANGELOG.md` with the new version and changes -3. Build all schemas: `npm run build:all` -4. Commit the version bump, changelog, and regenerated schemas +3. Build the schema: `npm run build` — this also syncs `package.json` version automatically +4. Commit the version bump, changelog, regenerated schema, and updated `package.json` 5. Open a PR and merge to `main` The CI workflow enforces that the version in `main.tsp` has been bumped from the latest release tag. If the version is unchanged, CI will fail and block the merge. @@ -36,13 +36,10 @@ On every push to `main`, the release workflow: 1. **Extracts** the version from `main.tsp` 2. **Skips** if a Git tag for that version already exists (idempotent) -3. **Builds** all four schema variants from TypeSpec sources +3. **Builds** the core schema from TypeSpec sources 4. **Creates** an annotated Git tag (`vX.Y.Z`) -5. **Publishes** a GitHub Release with auto-generated release notes and four artifacts: +5. **Publishes** a GitHub Release with auto-generated release notes and one artifact: - `core-openapi.yaml` (OpenAPI 3.0) - - `core-swagger.yaml` (OpenAPI 2.0) - - `gcp-openapi.yaml` (OpenAPI 3.0) - - `gcp-swagger.yaml` (OpenAPI 2.0) ## CI Validation @@ -61,18 +58,16 @@ Downstream Go consumers can import schemas directly: ```go import specschemas "github.com/openshift-hyperfleet/hyperfleet-api-spec/schemas" -data, err := specschemas.FS.ReadFile("gcp/openapi.yaml") +data, err := specschemas.FS.ReadFile("core/openapi.yaml") ``` ### Download URLs **Latest release (always points to newest):** - Core: `https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/latest/download/core-openapi.yaml` -- GCP: `https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/latest/download/gcp-openapi.yaml` **Specific version:** - Core: `https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/download/vX.Y.Z/core-openapi.yaml` -- GCP: `https://github.com/openshift-hyperfleet/hyperfleet-api-spec/releases/download/vX.Y.Z/gcp-openapi.yaml` ## Troubleshooting diff --git a/aliases-core.tsp b/aliases-core.tsp deleted file mode 100644 index 406e7d5..0000000 --- a/aliases-core.tsp +++ /dev/null @@ -1,11 +0,0 @@ -import "./models-core/cluster/model.tsp"; -import "./models-core/cluster/example_cluster.tsp"; -import "./models-core/cluster/example_post.tsp"; -import "./models-core/cluster/example_patch.tsp"; -import "./models-core/nodepool/model.tsp"; -import "./models-core/nodepool/example_nodepool.tsp"; -import "./models-core/nodepool/example_post.tsp"; -import "./models-core/nodepool/example_patch.tsp"; -import "./services/statuses.tsp"; -import "./services/statuses-internal.tsp"; -import "./services/force-delete-internal.tsp"; diff --git a/aliases-gcp.tsp b/aliases-gcp.tsp deleted file mode 100644 index 740b67f..0000000 --- a/aliases-gcp.tsp +++ /dev/null @@ -1,18 +0,0 @@ -import "./models-gcp/cluster/model.tsp"; -import "./models-gcp/cluster/example_cluster.tsp"; -import "./models-gcp/cluster/example_post.tsp"; -import "./models-gcp/cluster/example_patch.tsp"; -import "./models-gcp/nodepool/model.tsp"; -import "./models-gcp/nodepool/example_nodepool.tsp"; -import "./models-gcp/nodepool/example_post.tsp"; -import "./models-gcp/nodepool/example_patch.tsp"; -import "./models-gcp/channel/model.tsp"; -import "./models-gcp/channel/example_channel.tsp"; -import "./models-gcp/channel/example_post.tsp"; -import "./models-gcp/channel/example_patch.tsp"; -import "./models-gcp/version/model.tsp"; -import "./models-gcp/version/example_version.tsp"; -import "./models-gcp/version/example_post.tsp"; -import "./models-gcp/version/example_patch.tsp"; -import "./services/channels.tsp"; -import "./services/versions.tsp"; diff --git a/aliases.tsp b/aliases.tsp deleted file mode 120000 index d42dbb3..0000000 --- a/aliases.tsp +++ /dev/null @@ -1 +0,0 @@ -aliases-core.tsp \ No newline at end of file diff --git a/build-schema.sh b/build-schema.sh index 0126ffc..f9b6901 100755 --- a/build-schema.sh +++ b/build-schema.sh @@ -1,140 +1,52 @@ #!/bin/bash -# Build HyperFleet OpenAPI Schema -# Usage: ./build-schema.sh [--swagger|--openapi2] -# provider: core, gcp, or any provider with aliases-{provider}.tsp file (required, must be first argument) -# --swagger, --openapi2: Also generate OpenAPI 2.0 (Swagger) format +# Build HyperFleet core OpenAPI schema +# Usage: ./build-schema.sh set -e -# Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' -NC='\033[0m' # No Color +NC='\033[0m' -# Parse arguments -GENERATE_SWAGGER=false - -# Provider is required and must be the first argument -if [ $# -lt 1 ]; then - echo -e "${RED}Error: Provider argument is required${NC}" - echo "Usage: $0 [--swagger|--openapi2]" - echo " provider: core, gcp, or any provider with aliases-{provider}.tsp file" - echo " --swagger, --openapi2: Also generate OpenAPI 2.0 (Swagger) format" - exit 1 -fi - -PROVIDER="$1" -shift - -# Check if provider looks like an option (starts with -) -if [[ "$PROVIDER" == -* ]]; then - echo -e "${RED}Error: Provider must be the first argument${NC}" - echo "Usage: $0 [--swagger|--openapi2]" - exit 1 -fi - -# Parse remaining options -for arg in "$@"; do - case $arg in - --swagger|--openapi2) - GENERATE_SWAGGER=true - ;; - -*) - echo -e "${RED}Error: Unknown option: $arg${NC}" - echo "Usage: $0 [--swagger|--openapi2]" - exit 1 - ;; - *) - echo -e "${RED}Error: Unexpected argument: $arg${NC}" - echo "Usage: $0 [--swagger|--openapi2]" - exit 1 - ;; - esac -done - -# Script directory (where the script is located) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" -# Define the aliases file for the provider -ALIASES_FILE="aliases-${PROVIDER}.tsp" - -# Check if the aliases file exists -if [ ! -f "$ALIASES_FILE" ]; then - echo -e "${RED}Error: Provider aliases file not found: ${ALIASES_FILE}${NC}" - echo "" - echo "Available providers:" - for file in aliases-*.tsp; do - if [ -f "$file" ]; then - provider_name=$(echo "$file" | sed 's/aliases-\(.*\)\.tsp/\1/') - echo " - $provider_name" - fi - done - exit 1 -fi - -# Check if main.tsp exists -if [ ! -f "main.tsp" ]; then - echo -e "${RED}Error: main.tsp not found in current directory${NC}" - exit 1 -fi - -# Check if tsp command is available if [ ! -x "${SCRIPT_DIR}/node_modules/.bin/tsp" ]; then echo -e "${RED}Error: tsp not found in node_modules. Run 'npm install' first.${NC}" exit 1 fi TSP="${SCRIPT_DIR}/node_modules/.bin/tsp" -# Check if api-spec-converter is available when swagger output is requested -if [ "$GENERATE_SWAGGER" = true ]; then - if ! npx api-spec-converter --version &> /dev/null; then - echo -e "${RED}Error: api-spec-converter not found. Please install it.${NC}" - echo "Install with: npm install --save-dev api-spec-converter" - exit 1 - fi -fi - -echo -e "${GREEN}Building HyperFleet API schema for provider: ${PROVIDER}${NC}" -if [ "$GENERATE_SWAGGER" = true ]; then - echo -e "${GREEN}Output formats: OpenAPI 3.0 + OpenAPI 2.0 (Swagger)${NC}" -else - echo -e "${GREEN}Output format: OpenAPI 3.0${NC}" -fi +echo -e "${GREEN}Building HyperFleet core API schema${NC}" echo "" -# Step 1: Re-link aliases.tsp to the provider-specific aliases file -echo -e "${YELLOW}Step 1: Linking aliases.tsp to ${ALIASES_FILE}${NC}" -if [ -L "aliases.tsp" ] || [ -f "aliases.tsp" ]; then - rm -f aliases.tsp +VERSION=$(grep -oE 'version: "[^"]+"' main.tsp | sed 's/version: "//;s/"//') +if [ -z "$VERSION" ]; then + echo -e "${RED}Error: Could not extract version from main.tsp${NC}" + exit 1 fi -ln -sf "$ALIASES_FILE" aliases.tsp -echo -e "${GREEN}✓ Linked aliases.tsp → ${ALIASES_FILE}${NC}" +echo -e "${YELLOW}Step 1: Syncing package.json version to ${VERSION}...${NC}" +npm version "$VERSION" --no-git-tag-version --allow-same-version --silent +echo -e "${GREEN}✓ package.json version set to ${VERSION}${NC}" echo "" -# Step 2: Create output directory for the provider -OUTPUT_DIR="schemas/${PROVIDER}" +OUTPUT_DIR="schemas/core" echo -e "${YELLOW}Step 2: Preparing output directory...${NC}" mkdir -p "$OUTPUT_DIR" echo -e "${GREEN}✓ Created output directory: ${OUTPUT_DIR}${NC}" echo "" -# Step 3: Compile TypeSpec to generate OpenAPI schema -echo -e "${YELLOW}Step 3: Compiling TypeSpec...${NC}" -TEMP_OUTPUT_DIR="tsp-output-${PROVIDER}" +echo -e "${YELLOW}Step 3: Compiling TypeSpec from core/main.tsp...${NC}" +TEMP_OUTPUT_DIR="tsp-output-core" -# Cleanup function to remove temporary directory on exit cleanup() { - if [ -d "$TEMP_OUTPUT_DIR" ]; then - rm -rf "$TEMP_OUTPUT_DIR" - fi + rm -rf "$TEMP_OUTPUT_DIR" } trap cleanup EXIT -if "$TSP" compile main.tsp --output-dir "$TEMP_OUTPUT_DIR"; then - # Move the generated schema to the provider-specific directory +if "$TSP" compile ./main.tsp --output-dir "$TEMP_OUTPUT_DIR"; then if [ -f "${TEMP_OUTPUT_DIR}/schema/openapi.yaml" ]; then mv "${TEMP_OUTPUT_DIR}/schema/openapi.yaml" "${OUTPUT_DIR}/openapi.yaml" echo "" @@ -152,25 +64,5 @@ else exit 1 fi -# Step 4: Convert to OpenAPI 2.0 (Swagger) if requested -if [ "$GENERATE_SWAGGER" = true ]; then - echo "" - echo -e "${YELLOW}Step 4: Converting to OpenAPI 2.0 (Swagger)...${NC}" - - if npx api-spec-converter \ - --from=openapi_3 \ - --to=swagger_2 \ - --syntax=yaml \ - "${OUTPUT_DIR}/openapi.yaml" > "${OUTPUT_DIR}/swagger.yaml" 2>/dev/null; then - echo -e "${GREEN}✓ Successfully generated OpenAPI 2.0 (Swagger) schema${NC}" - echo -e "${GREEN}Output: ${OUTPUT_DIR}/swagger.yaml${NC}" - else - echo -e "${RED}✗ Failed to convert to OpenAPI 2.0 (Swagger)${NC}" - echo "The OpenAPI 3.0 schema may contain features not supported in OpenAPI 2.0" - rm -f "${OUTPUT_DIR}/swagger.yaml" - exit 1 - fi -fi - echo "" echo -e "${GREEN}Build complete!${NC}" diff --git a/models-core/cluster/example_cluster.tsp b/core/models/cluster/example_cluster.tsp similarity index 97% rename from models-core/cluster/example_cluster.tsp rename to core/models/cluster/example_cluster.tsp index 8e2afb2..6de5db2 100644 --- a/models-core/cluster/example_cluster.tsp +++ b/core/models/cluster/example_cluster.tsp @@ -1,6 +1,6 @@ -import "../../aliases-core.tsp"; -import "../../models/clusters/model.tsp"; -import "../../models/common/model.tsp"; +import "./model.tsp"; +import "../../../shared/models/clusters/model.tsp"; +import "../../../shared/models/common/model.tsp"; const exampleCluster: Cluster = #{ kind: "Cluster", diff --git a/models-core/cluster/example_patch.tsp b/core/models/cluster/example_patch.tsp similarity index 58% rename from models-core/cluster/example_patch.tsp rename to core/models/cluster/example_patch.tsp index 35330ba..3b49b21 100644 --- a/models-core/cluster/example_patch.tsp +++ b/core/models/cluster/example_patch.tsp @@ -1,5 +1,5 @@ -import "../../aliases-core.tsp"; -import "../../models/clusters/model.tsp"; +import "./model.tsp"; +import "../../../shared/models/clusters/model.tsp"; const exampleClusterPatchRequest: ClusterPatchRequest = #{ spec: #{}, diff --git a/models-core/cluster/example_post.tsp b/core/models/cluster/example_post.tsp similarity index 70% rename from models-core/cluster/example_post.tsp rename to core/models/cluster/example_post.tsp index e13af29..54d7c43 100644 --- a/models-core/cluster/example_post.tsp +++ b/core/models/cluster/example_post.tsp @@ -1,5 +1,5 @@ -import "../../aliases-core.tsp"; -import "../../models/clusters/model.tsp"; +import "./model.tsp"; +import "../../../shared/models/clusters/model.tsp"; const exampleClusterCreateRequest: ClusterCreateRequest = #{ kind: "Cluster", diff --git a/models-core/cluster/model.tsp b/core/models/cluster/model.tsp similarity index 88% rename from models-core/cluster/model.tsp rename to core/models/cluster/model.tsp index b852beb..a3b9ac0 100644 --- a/models-core/cluster/model.tsp +++ b/core/models/cluster/model.tsp @@ -3,4 +3,4 @@ * Accepts any properties as the spec is provider-agnostic. * This is represented as a simple object to allow flexibility. */ -model ClusterSpec {} \ No newline at end of file +model ClusterSpec {} diff --git a/models-core/nodepool/example_nodepool.tsp b/core/models/nodepool/example_nodepool.tsp similarity index 97% rename from models-core/nodepool/example_nodepool.tsp rename to core/models/nodepool/example_nodepool.tsp index 83c30f1..dd26944 100644 --- a/models-core/nodepool/example_nodepool.tsp +++ b/core/models/nodepool/example_nodepool.tsp @@ -1,6 +1,6 @@ -import "../../aliases-core.tsp"; -import "../../models/nodepools/model.tsp"; -import "../../models/common/model.tsp"; +import "./model.tsp"; +import "../../../shared/models/nodepools/model.tsp"; +import "../../../shared/models/common/model.tsp"; const exampleNodePool: NodePool = #{ kind: "NodePool", diff --git a/models-core/nodepool/example_patch.tsp b/core/models/nodepool/example_patch.tsp similarity index 58% rename from models-core/nodepool/example_patch.tsp rename to core/models/nodepool/example_patch.tsp index 4f0f449..4705a6a 100644 --- a/models-core/nodepool/example_patch.tsp +++ b/core/models/nodepool/example_patch.tsp @@ -1,5 +1,5 @@ -import "../../aliases-core.tsp"; -import "../../models/nodepools/model.tsp"; +import "./model.tsp"; +import "../../../shared/models/nodepools/model.tsp"; const exampleNodePoolPatchRequest: NodePoolPatchRequest = #{ spec: #{}, diff --git a/models-core/nodepool/example_post.tsp b/core/models/nodepool/example_post.tsp similarity index 68% rename from models-core/nodepool/example_post.tsp rename to core/models/nodepool/example_post.tsp index f6443b2..f079832 100644 --- a/models-core/nodepool/example_post.tsp +++ b/core/models/nodepool/example_post.tsp @@ -1,5 +1,5 @@ -import "../../aliases-core.tsp"; -import "../../models/nodepools/model.tsp"; +import "./model.tsp"; +import "../../../shared/models/nodepools/model.tsp"; const exampleNodePoolCreateRequest: NodePoolCreateRequest = #{ name: "worker-pool-1", diff --git a/models-core/nodepool/model.tsp b/core/models/nodepool/model.tsp similarity index 88% rename from models-core/nodepool/model.tsp rename to core/models/nodepool/model.tsp index b0f89a3..5505ea0 100644 --- a/models-core/nodepool/model.tsp +++ b/core/models/nodepool/model.tsp @@ -3,4 +3,4 @@ * Accepts any properties as the spec is provider-agnostic. * This is represented as a simple object to allow flexibility. */ -model NodePoolSpec {} \ No newline at end of file +model NodePoolSpec {} diff --git a/services/force-delete-internal.tsp b/core/services/force-delete-internal.tsp similarity index 97% rename from services/force-delete-internal.tsp rename to core/services/force-delete-internal.tsp index ae72d58..5925265 100644 --- a/services/force-delete-internal.tsp +++ b/core/services/force-delete-internal.tsp @@ -2,7 +2,7 @@ import "@typespec/http"; import "@typespec/openapi"; import "@typespec/openapi3"; -import "../models/common/model.tsp"; +import "../../shared/models/common/model.tsp"; using Http; using OpenAPI; diff --git a/services/statuses-internal.tsp b/core/services/statuses-internal.tsp similarity index 86% rename from services/statuses-internal.tsp rename to core/services/statuses-internal.tsp index a6de01b..b692086 100644 --- a/services/statuses-internal.tsp +++ b/core/services/statuses-internal.tsp @@ -2,10 +2,9 @@ import "@typespec/http"; import "@typespec/openapi"; import "@typespec/openapi3"; -import "../models/statuses/model.tsp"; -import "../models/common/model.tsp"; -import "../models/nodepools/model.tsp"; -import "../models/resource/model.tsp"; +import "../../shared/models/statuses/model.tsp"; +import "../../shared/models/common/model.tsp"; +import "../../shared/models/nodepools/model.tsp"; using Http; using OpenAPI; @@ -67,21 +66,6 @@ interface NodePoolStatusesInternal { @route("/resources/{resource_id}/statuses") @useAuth(HyperFleet.BearerAuth) interface ResourceStatusesInternal { - /** - * Returns adapter statuses for a resource. - */ - @route("") - @get - @summary("List resource statuses") - @operationId("getResourceStatuses") - getResourceStatuses( - @path resource_id: string, - ...QueryParams, - ): Body - | Error - | NotFoundResponse - | BadRequestResponse; - @route("") @put @summary("Adapter creates or updates resource status") @@ -119,4 +103,3 @@ interface ResourcesForceDelete { | BadRequestResponse | ConflictResponse; } - diff --git a/main.tsp b/main.tsp index fd44f51..092cfe7 100644 --- a/main.tsp +++ b/main.tsp @@ -2,11 +2,21 @@ import "@typespec/http"; import "@typespec/openapi"; import "@typespec/openapi3"; -import "./services/clusters.tsp"; -import "./services/nodepools.tsp"; -import "./services/resources.tsp"; -// Provider-specific security is imported via aliases.tsp -import "./aliases.tsp"; +import "./core/models/cluster/model.tsp"; +import "./core/models/cluster/example_cluster.tsp"; +import "./core/models/cluster/example_post.tsp"; +import "./core/models/cluster/example_patch.tsp"; +import "./core/models/nodepool/model.tsp"; +import "./core/models/nodepool/example_nodepool.tsp"; +import "./core/models/nodepool/example_post.tsp"; +import "./core/models/nodepool/example_patch.tsp"; +import "./core/services/statuses-internal.tsp"; + +import "./shared/services/clusters.tsp"; +import "./shared/services/statuses.tsp"; +import "./shared/services/nodepools.tsp"; +import "./shared/services/resources.tsp"; +import "./core/services/force-delete-internal.tsp"; using Http; using OpenAPI; @@ -21,7 +31,7 @@ using OpenAPI; */ @service(#{ title: "HyperFleet API" }) @info(#{ - version: "1.0.17", + version: "1.0.18", contact: #{ name: "HyperFleet Team", url: "https://github.com/openshift-hyperfleet", diff --git a/models-gcp/channel/example_channel.tsp b/models-gcp/channel/example_channel.tsp deleted file mode 100644 index 1f681ec..0000000 --- a/models-gcp/channel/example_channel.tsp +++ /dev/null @@ -1,22 +0,0 @@ -import "./model.tsp"; -import "../../models/common/model.tsp"; - -const exampleChannel: Channel = #{ - kind: "Channel", - id: "019466a2-1234-7abc-9def-0123456789ab", - href: "/api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab", - name: "stable", - labels: #{ tier: "production" }, - spec: #{ - is_default: true, - enabled_regex: "^4\\.\\d+\\.\\d+$", - }, - generation: 1, - status: #{ - conditions: #[], - }, - created_time: "2025-06-01T00:00:00Z", - updated_time: "2025-06-01T10:02:00Z", - created_by: "user-123@example.com", - updated_by: "user-123@example.com", -}; diff --git a/models-gcp/channel/example_patch.tsp b/models-gcp/channel/example_patch.tsp deleted file mode 100644 index 481bfb3..0000000 --- a/models-gcp/channel/example_patch.tsp +++ /dev/null @@ -1,9 +0,0 @@ -import "./model.tsp"; - -const exampleChannelPatchRequest: ChannelPatchRequest = #{ - spec: #{ - is_default: false, - enabled_regex: "^4\\.17\\.\\d+$", - }, - labels: #{ tier: "staging" }, -}; diff --git a/models-gcp/channel/example_post.tsp b/models-gcp/channel/example_post.tsp deleted file mode 100644 index da36a93..0000000 --- a/models-gcp/channel/example_post.tsp +++ /dev/null @@ -1,11 +0,0 @@ -import "./model.tsp"; - -const exampleChannelCreateRequest: ChannelCreateRequest = #{ - kind: "Channel", - name: "stable", - labels: #{ tier: "production" }, - spec: #{ - is_default: true, - enabled_regex: "^4\\.\\d+\\.\\d+$", - }, -}; diff --git a/models-gcp/channel/model.tsp b/models-gcp/channel/model.tsp deleted file mode 100644 index 84130f3..0000000 --- a/models-gcp/channel/model.tsp +++ /dev/null @@ -1,55 +0,0 @@ -import "@typespec/openapi"; -import "../../models/common/model.tsp"; -import "../../models/statuses/model.tsp"; -import "../../models/resource/model.tsp"; - -using OpenAPI; - -alias KindChannel = "Channel"; - -model ChannelSpec { - /** Whether this is the default channel for new clusters */ - is_default: boolean; - - /** Regex pattern for matching enabled version strings */ - enabled_regex: string; -} - -model ChannelBase { - ...APIResource; - - @minLength(1) - @maxLength(63) - @pattern("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$") - name: string; - - spec: ChannelSpec; -} - -@example(exampleChannel) -model Channel { - ...ChannelBase; - ...APIMetadata; - - @minValue(1) - generation: int32; - - status: ResourceStatus; -} - -@example(exampleChannelCreateRequest) -model ChannelCreateRequest { - ...ChannelBase; -} - -@extension("minProperties", 1) -@extension("additionalProperties", false) -@example(exampleChannelPatchRequest) -model ChannelPatchRequest { - spec?: ChannelSpec; - labels?: Record; -} - -model ChannelList { - ...List; -} diff --git a/models-gcp/cluster/example_cluster.tsp b/models-gcp/cluster/example_cluster.tsp deleted file mode 100644 index 9c8cdff..0000000 --- a/models-gcp/cluster/example_cluster.tsp +++ /dev/null @@ -1,167 +0,0 @@ -import "../../aliases-gcp.tsp"; -import "../../models/clusters/model.tsp"; -import "../../models/common/model.tsp"; - -const exampleCluster: Cluster = #{ - kind: "Cluster", - id: "019466a0-8f8e-7abc-9def-0123456789ab", - href: "https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab", - name: "cluster-123", - labels: #{ environment: "production", team: "platform" }, - spec: #{ - platform: #{ - type: "gcp", - gcp: #{ - projectID: "project-123", - region: "us-central1", - zone: "us-central1-a", - network: "network-123", - subnet: "subnet-123", - }, - }, - release: #{ - image: "registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4", - version: "4.22.0-ec.4", - channelGroup: "candidate", - }, - networking: #{ - clusterNetwork: #[ #{ cidr: "10.10.0.0/16", hostPrefix: 24 } ], - serviceNetwork: #["10.96.0.0/12"], - }, - dns: #{ - baseDomain: "example.com", - }, - }, - generation: 1, - status: #{ - conditions: #[ - #{ - type: ConditionType.Reconciled, - status: ResourceConditionStatus.True, - reason: ExampleReconciledReason, - message: ExampleReconciledMessage, - observed_generation: 1, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: ConditionType.LastKnownReconciled, - status: ResourceConditionStatus.True, - reason: ExampleLastKnownReconciledReason, - message: ExampleLastKnownReconciledMessage, - observed_generation: 1, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: "Adapter1Successful", - status: ResourceConditionStatus.True, - reason: ExampleAdapter1AvailableReason, - message: ExampleAdapter1AvailableMessage, - observed_generation: 1, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: "Adapter2Successful", - status: ResourceConditionStatus.True, - reason: ExampleAdapter2AvailableReason, - message: ExampleAdapter2AvailableMessage, - observed_generation: 1, - created_time: "2021-01-01T10:01:00Z", - last_updated_time: "2021-01-01T10:01:00Z", - last_transition_time: "2021-01-01T10:01:00Z", - } - ], - }, - created_time: "2021-01-01T00:00:00Z", - updated_time: "2021-01-01T10:02:00Z", - created_by: "user-123@example.com", - updated_by: "user-123@example.com", -}; - -const exampleDeletedCluster: Cluster = #{ - kind: "Cluster", - id: "019466a0-8f8e-7abc-9def-0123456789ab", - href: "https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab", - name: "cluster-123", - labels: #{ environment: "production", team: "platform" }, - spec: #{ - platform: #{ - type: "gcp", - gcp: #{ - projectID: "project-123", - region: "us-central1", - zone: "us-central1-a", - network: "network-123", - subnet: "subnet-123", - }, - }, - release: #{ - image: "registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4", - version: "4.22.0-ec.4", - channelGroup: "candidate", - }, - networking: #{ - clusterNetwork: #[ #{ cidr: "10.10.0.0/16", hostPrefix: 24 } ], - serviceNetwork: #["10.96.0.0/12"], - }, - dns: #{ - baseDomain: "example.com", - }, - }, - generation: 2, - status: #{ - conditions: #[ - #{ - type: ConditionType.Reconciled, - status: ResourceConditionStatus.True, - reason: ExampleReconciledReason, - message: ExampleReconciledMessage, - observed_generation: 2, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: ConditionType.LastKnownReconciled, - status: ResourceConditionStatus.True, - reason: ExampleLastKnownReconciledReason, - message: ExampleLastKnownReconciledMessage, - observed_generation: 2, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: "Adapter1Successful", - status: ResourceConditionStatus.True, - reason: ExampleAdapter1AvailableReason, - message: ExampleAdapter1AvailableMessage, - observed_generation: 2, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: "Adapter2Successful", - status: ResourceConditionStatus.True, - reason: ExampleAdapter2AvailableReason, - message: ExampleAdapter2AvailableMessage, - observed_generation: 2, - created_time: "2021-01-01T10:01:00Z", - last_updated_time: "2021-01-01T10:01:00Z", - last_transition_time: "2021-01-01T10:01:00Z", - } - ], - }, - created_time: "2021-01-01T00:00:00Z", - updated_time: "2021-01-01T10:02:00Z", - deleted_time: "2021-01-01T10:05:00Z", - created_by: "user-123@example.com", - updated_by: "user-123@example.com", - deleted_by: "user-123@example.com", -}; diff --git a/models-gcp/cluster/example_patch.tsp b/models-gcp/cluster/example_patch.tsp deleted file mode 100644 index 4f4be3f..0000000 --- a/models-gcp/cluster/example_patch.tsp +++ /dev/null @@ -1,28 +0,0 @@ -import "../../aliases-gcp.tsp"; -import "../../models/clusters/model.tsp"; - -const exampleClusterPatchRequest: ClusterPatchRequest = #{ - spec: #{ - platform: #{ - type: "gcp", - gcp: #{ - projectID: "project-123", - region: "us-central1", - zone: "us-central1-a", - network: "network-123", - subnet: "subnet-123", - }, - }, - release: #{ - image: "registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4", - version: "4.22.0-ec.4", - channelGroup: "candidate", - }, - networking: #{ - clusterNetwork: #[#{ cidr: "10.10.0.0/16", hostPrefix: 24 }], - serviceNetwork: #["10.96.0.0/12"], - }, - dns: #{ baseDomain: "example.com" }, - }, - labels: #{ env: "staging" }, -}; diff --git a/models-gcp/cluster/example_post.tsp b/models-gcp/cluster/example_post.tsp deleted file mode 100644 index 79f5d6b..0000000 --- a/models-gcp/cluster/example_post.tsp +++ /dev/null @@ -1,30 +0,0 @@ -import "../../aliases-gcp.tsp"; -import "../../models/clusters/model.tsp"; - -const exampleClusterCreateRequest: ClusterCreateRequest = #{ - kind: "Cluster", - name: "cluster-123", - labels: #{ environment: "production", team: "platform" }, - spec: #{ - platform: #{ - type: "gcp", - gcp: #{ - projectID: "project-123", - region: "us-central1", - zone: "us-central1-a", - network: "network-123", - subnet: "subnet-123", - }, - }, - release: #{ - image: "registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4", - version: "4.22.0-ec.4", - channelGroup: "candidate", - }, - networking: #{ - clusterNetwork: #[#{ cidr: "10.10.0.0/16", hostPrefix: 24 }], - serviceNetwork: #["10.96.0.0/12"], - }, - dns: #{ baseDomain: "example.com" }, - } -}; diff --git a/models-gcp/cluster/model.tsp b/models-gcp/cluster/model.tsp deleted file mode 100644 index a98abb9..0000000 --- a/models-gcp/cluster/model.tsp +++ /dev/null @@ -1,40 +0,0 @@ -model ClusterSpec { - infraID?: string; - platform: ClusterPlatformSpec; - release?: ReleaseSpec; - networking?: NetworkingSpec; - dns?: DNSSpec; -} - -model ClusterPlatformSpec { - type: "gcp"; - gcp: ClusterPlatform; -} - -model ClusterPlatform { - projectID?: string; - region?: string; - zone?: string; - network?: string; - subnet?: string; -} - -model ReleaseSpec { - image?: string; - version?: string; - channelGroup?: string; -} - -model NetworkingSpec { - clusterNetwork?: ClusterNetworkEntry[]; - serviceNetwork?: string[]; -} - -model ClusterNetworkEntry { - cidr?: string; - hostPrefix?: integer; -} - -model DNSSpec { - baseDomain?: string; -} diff --git a/models-gcp/nodepool/example_nodepool.tsp b/models-gcp/nodepool/example_nodepool.tsp deleted file mode 100644 index ba6ce61..0000000 --- a/models-gcp/nodepool/example_nodepool.tsp +++ /dev/null @@ -1,175 +0,0 @@ -import "../../aliases-gcp.tsp"; -import "../../models/nodepools/model.tsp"; -import "../../models/common/model.tsp"; - -const exampleNodePool: NodePool = #{ - kind: "NodePool", - id: "019466a1-2b3c-7def-8abc-456789abcdef", - href: "https://api.hyperfleet.com/v1/nodepools/019466a1-2b3c-7def-8abc-456789abcdef", - name: "worker-pool-1", - labels: #{ environment: "production", pooltype: "worker" }, - generation: 1, - spec: #{ - platform: #{ - type: "gcp", - gcp: #{ - machineType: "n1-standard-4", - diskSize: 100, - diskType: "pd-standard", - zones: #["us-central1-a", "us-central1-b"], - preemptible: false, - labels: #{ - team: "platform", - managedby: "hyperfleet", - }, - }, - }, - nodeCount: 3, - autoscaling: #{ - enabled: true, - minNodes: 1, - maxNodes: 10, - targetCPUUtilization: 80, - }, - }, - owner_references: #{ - id: "019466a0-8f8e-7abc-9def-0123456789ab", - kind: "Cluster", - href: "https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab", - }, - status: #{ - conditions: #[ - #{ - type: ConditionType.Reconciled, - status: ResourceConditionStatus.True, - reason: ExampleReconciledReason, - message: ExampleReconciledMessage, - observed_generation: 1, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: ConditionType.LastKnownReconciled, - status: ResourceConditionStatus.True, - reason: ExampleLastKnownReconciledReason, - message: ExampleLastKnownReconciledMessage, - observed_generation: 1, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: "ValidationSuccessful", - status: ResourceConditionStatus.True, - reason: "All validations passed", - message: "NodePool validation passed", - observed_generation: 1, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: "NodePoolSuccessful", - status: ResourceConditionStatus.True, - reason: "NodePool provisioned successfully", - message: "NodePool has 3 nodes running", - observed_generation: 1, - created_time: "2021-01-01T10:01:00Z", - last_updated_time: "2021-01-01T10:01:00Z", - last_transition_time: "2021-01-01T10:01:00Z", - }, - ], - }, - created_time: "2021-01-01T00:00:00Z", - updated_time: "2021-01-01T10:02:00Z", - created_by: "user-123@example.com", - updated_by: "user-123@example.com", -}; - -const exampleDeletedNodePool: NodePool = #{ - kind: "NodePool", - id: "019466a1-2b3c-7def-8abc-456789abcdef", - href: "https://api.hyperfleet.com/v1/nodepools/019466a1-2b3c-7def-8abc-456789abcdef", - name: "worker-pool-1", - labels: #{ environment: "production", pooltype: "worker" }, - generation: 2, - spec: #{ - platform: #{ - type: "gcp", - gcp: #{ - machineType: "n1-standard-4", - diskSize: 100, - diskType: "pd-standard", - zones: #["us-central1-a", "us-central1-b"], - preemptible: false, - labels: #{ - team: "platform", - managedby: "hyperfleet", - }, - }, - }, - nodeCount: 3, - autoscaling: #{ - enabled: true, - minNodes: 1, - maxNodes: 10, - targetCPUUtilization: 80, - }, - }, - owner_references: #{ - id: "019466a0-8f8e-7abc-9def-0123456789ab", - kind: "Cluster", - href: "https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab", - }, - status: #{ - conditions: #[ - #{ - type: ConditionType.Reconciled, - status: ResourceConditionStatus.True, - reason: ExampleReconciledReason, - message: ExampleReconciledMessage, - observed_generation: 2, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: ConditionType.LastKnownReconciled, - status: ResourceConditionStatus.True, - reason: ExampleLastKnownReconciledReason, - message: ExampleLastKnownReconciledMessage, - observed_generation: 2, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: "ValidationSuccessful", - status: ResourceConditionStatus.True, - reason: "All validations passed", - message: "NodePool validation passed", - observed_generation: 2, - created_time: "2021-01-01T10:00:00Z", - last_updated_time: "2021-01-01T10:00:00Z", - last_transition_time: "2021-01-01T10:00:00Z", - }, - #{ - type: "NodePoolSuccessful", - status: ResourceConditionStatus.True, - reason: "NodePool provisioned successfully", - message: "NodePool has 3 nodes running", - observed_generation: 2, - created_time: "2021-01-01T10:01:00Z", - last_updated_time: "2021-01-01T10:01:00Z", - last_transition_time: "2021-01-01T10:01:00Z", - }, - ], - }, - created_time: "2021-01-01T00:00:00Z", - updated_time: "2021-01-01T10:02:00Z", - deleted_time: "2021-01-01T10:05:00Z", - created_by: "user-123@example.com", - updated_by: "user-123@example.com", - deleted_by: "user-123@example.com", -}; diff --git a/models-gcp/nodepool/example_patch.tsp b/models-gcp/nodepool/example_patch.tsp deleted file mode 100644 index 85aa8df..0000000 --- a/models-gcp/nodepool/example_patch.tsp +++ /dev/null @@ -1,29 +0,0 @@ -import "../../aliases-gcp.tsp"; -import "../../models/nodepools/model.tsp"; - -const exampleNodePoolPatchRequest: NodePoolPatchRequest = #{ - spec: #{ - platform: #{ - type: "gcp", - gcp: #{ - machineType: "n1-standard-4", - diskSize: 100, - diskType: "pd-standard", - zones: #["us-central1-a", "us-central1-b"], - preemptible: false, - labels: #{ - team: "platform", - managedby: "hyperfleet", - }, - }, - }, - nodeCount: 3, - autoscaling: #{ - enabled: true, - minNodes: 1, - maxNodes: 10, - targetCPUUtilization: 80, - }, - }, - labels: #{ env: "staging" }, -}; diff --git a/models-gcp/nodepool/example_post.tsp b/models-gcp/nodepool/example_post.tsp deleted file mode 100644 index 88a91a1..0000000 --- a/models-gcp/nodepool/example_post.tsp +++ /dev/null @@ -1,30 +0,0 @@ -import "../../aliases-gcp.tsp"; -import "../../models/nodepools/model.tsp"; - -const exampleNodePoolCreateRequest: NodePoolCreateRequest = #{ - name: "worker-pool-1", - labels: #{ environment: "production", pooltype: "worker" }, - spec: #{ - platform: #{ - type: "gcp", - gcp: #{ - machineType: "n1-standard-4", - diskSize: 100, - diskType: "pd-standard", - zones: #["us-central1-a", "us-central1-b"], - preemptible: false, - labels: #{ - team: "platform", - managedby: "hyperfleet", - }, - }, - }, - nodeCount: 3, - autoscaling: #{ - enabled: true, - minNodes: 1, - maxNodes: 10, - targetCPUUtilization: 80, - }, - }, -}; diff --git a/models-gcp/nodepool/model.tsp b/models-gcp/nodepool/model.tsp deleted file mode 100644 index ff7a153..0000000 --- a/models-gcp/nodepool/model.tsp +++ /dev/null @@ -1,40 +0,0 @@ -model NodePoolSpec { - platform: NodePoolPlatformSpec; - @minValue(0) nodeCount?: integer; - autoscaling?: AutoscalingSpec; -} - -model NodePoolPlatformSpec { - type: "gcp"; - gcp: NodePoolPlatform; -} - -model NodePoolPlatform { - machineType?: string; - @minValue(10) diskSize?: integer; - diskType?: "pd-standard" | "pd-ssd" | "pd-balanced"; - zones?: string[]; - preemptible?: boolean; - accelerators?: AcceleratorSpec[]; - labels?: Record; - taints?: TaintSpec[]; -} -model AutoscalingSpec { - enabled?: boolean; - @minValue(0) minNodes?: integer; - @minValue(1) maxNodes?: integer; - @minValue(1) @maxValue(100) targetCPUUtilization?: integer; - @minValue(1) @maxValue(100) targetMemoryUtilization?: integer; - scaleDownDelay?: string; - scaleUpDelay?: string; -} -model AcceleratorSpec { - type: string; - @minValue(1) count: integer; -} - -model TaintSpec { - key: string; - value?: string; - effect: "NoSchedule" | "PreferNoSchedule" | "NoExecute"; -} diff --git a/models-gcp/version/example_patch.tsp b/models-gcp/version/example_patch.tsp deleted file mode 100644 index a242719..0000000 --- a/models-gcp/version/example_patch.tsp +++ /dev/null @@ -1,11 +0,0 @@ -import "./model.tsp"; - -const exampleVersionPatchRequest: VersionPatchRequest = #{ - spec: #{ - raw_version: "4.17.12", - enabled: false, - is_default: false, - release_image: "quay.io/openshift-release-dev/ocp-release:4.17.12-multi", - }, - labels: #{ deprecated: "true" }, -}; diff --git a/models-gcp/version/example_post.tsp b/models-gcp/version/example_post.tsp deleted file mode 100644 index 7e1c2c5..0000000 --- a/models-gcp/version/example_post.tsp +++ /dev/null @@ -1,13 +0,0 @@ -import "./model.tsp"; - -const exampleVersionCreateRequest: VersionCreateRequest = #{ - kind: "Version", - name: "4.17.12", - labels: #{}, - spec: #{ - raw_version: "4.17.12", - enabled: true, - is_default: true, - release_image: "quay.io/openshift-release-dev/ocp-release:4.17.12-multi", - }, -}; diff --git a/models-gcp/version/example_version.tsp b/models-gcp/version/example_version.tsp deleted file mode 100644 index 671a980..0000000 --- a/models-gcp/version/example_version.tsp +++ /dev/null @@ -1,29 +0,0 @@ -import "./model.tsp"; -import "../../models/common/model.tsp"; - -const exampleVersion: Version = #{ - kind: "Version", - id: "019466a3-5678-7abc-9def-0123456789ab", - href: "/api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab/versions/019466a3-5678-7abc-9def-0123456789ab", - name: "4.17.12", - labels: #{}, - spec: #{ - raw_version: "4.17.12", - enabled: true, - is_default: true, - release_image: "quay.io/openshift-release-dev/ocp-release:4.17.12-multi", - }, - generation: 1, - owner_references: #{ - id: "019466a2-1234-7abc-9def-0123456789ab", - kind: "Channel", - href: "/api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab", - }, - status: #{ - conditions: #[], - }, - created_time: "2025-06-01T00:00:00Z", - updated_time: "2025-06-01T10:02:00Z", - created_by: "user-123@example.com", - updated_by: "user-123@example.com", -}; diff --git a/models-gcp/version/model.tsp b/models-gcp/version/model.tsp deleted file mode 100644 index a2602ae..0000000 --- a/models-gcp/version/model.tsp +++ /dev/null @@ -1,67 +0,0 @@ -import "@typespec/openapi"; -import "@typespec/http"; -import "../../models/common/model.tsp"; -import "../../models/statuses/model.tsp"; -import "../../models/resource/model.tsp"; - -using OpenAPI; -using Http; - -alias KindVersion = "Version"; - -model VersionSpec { - /** Raw version string (e.g., "4.17.12") */ - raw_version: string; - - /** Whether this version is enabled for provisioning */ - enabled: boolean; - - /** Whether this is the default version for its channel */ - is_default: boolean; - - /** Container image reference for the release */ - release_image: string; - - /** When this version reaches end of life */ - @format("date-time") end_of_life_time?: string; -} - -model VersionBase { - ...APIResource; - - @minLength(1) - @maxLength(63) - name: string; - - spec: VersionSpec; -} - -@example(exampleVersion) -model Version { - ...VersionBase; - ...APIMetadata; - - @minValue(1) - generation: int32; - - owner_references: ObjectReference; - - status: ResourceStatus; -} - -@example(exampleVersionCreateRequest) -model VersionCreateRequest { - ...VersionBase; -} - -@extension("minProperties", 1) -@extension("additionalProperties", false) -@example(exampleVersionPatchRequest) -model VersionPatchRequest { - spec?: VersionSpec; - labels?: Record; -} - -model VersionList { - ...List; -} diff --git a/models/compatibility/README.md b/models/compatibility/README.md deleted file mode 100644 index bee0135..0000000 --- a/models/compatibility/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Compatibility objects - -Objects in this folder are here to create an OpenAPI spec that is compatible with TRex conventions - -E.g. TRex presupones OAuth and bearer tokens, which we will not have in the MVP -But we introduce a fake endpoint with OAuth support for this \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 07e09dc..2b5941e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "hyperfleet", - "version": "0.1.0", + "version": "1.0.18", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "hyperfleet", - "version": "0.1.0", + "version": "1.0.18", "devDependencies": { "@stoplight/spectral-cli": "6.15.1", "@typespec/compiler": "^1.6.0", @@ -14,8 +14,7 @@ "@typespec/openapi": "^1.6.0", "@typespec/openapi3": "^1.6.0", "@typespec/rest": "^0.81.0", - "@typespec/versioning": "^0.81.0", - "api-spec-converter": "^2.12.0" + "@typespec/versioning": "^0.81.0" } }, "node_modules/@asyncapi/specs": { @@ -53,14 +52,6 @@ "node": ">=6.9.0" } }, - "node_modules/@cloudflare/json-schema-walker": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@cloudflare/json-schema-walker/-/json-schema-walker-0.1.1.tgz", - "integrity": "sha512-P3n0hEgk1m6uKWgL4Yb1owzXVG4pM70G4kRnDQxZXiVvfCRtaqiHu+ZRiRPzmwGBiLTO1LWc2yR1M8oz0YkXww==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, "node_modules/@inquirer/ansi": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.5.tgz", @@ -457,19 +448,6 @@ "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -508,16 +486,6 @@ "node": ">= 8" } }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, "node_modules/@rollup/plugin-commonjs": { "version": "22.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", @@ -1220,6 +1188,7 @@ "integrity": "sha512-4vuWtoepc4rYJ81K+P7xn2ByXIRhBM40rfzAGnpagNuGSVHuKEC6lqJqs3ePvhCpnxiYAC8XWpaOi+BEDzyhnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.29.0", "@inquirer/prompts": "^8.3.0", @@ -1398,6 +1367,7 @@ "integrity": "sha512-/DOkN2+MUZyLdmqYmSMZDjxikJTOuNxikTeOwG2fVOibnu8e6S1jzPAuN/mn6YyQBKeBCItMPmUOXIj61Wy8Bg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -1417,6 +1387,7 @@ "integrity": "sha512-xUQrHExKBh0XSP4cn+HcondDXjHJM5HCq2Xfy9tB1QflsFh5uP1JJt1+67g73VmHlhZVSUDcoFrnU95pfjyubg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -1495,6 +1466,7 @@ "integrity": "sha512-5bha4t64xA85zLY8VGm/6jNd2kwPHzjPq/dlCUjtgGfGXv2R6Ow/YIukqhqZnwnIgNAIlZ7nguekRMRx+2oO2w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -1502,14 +1474,6 @@ "@typespec/compiler": "^1.11.0" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -1529,6 +1493,7 @@ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1609,104 +1574,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/api-spec-converter": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/api-spec-converter/-/api-spec-converter-2.12.0.tgz", - "integrity": "sha512-awKL523vwkmyf3rTzmW/lopAbHRhqJw84IThAovtoQ60u6TblCoGIEhhpDDfb9WycncU2aDrVfqf9LQC5lcUTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.7.2", - "commander": "^2.20.0", - "composite-error": "^0.1.1", - "deep-sort-object": "^1.0.2", - "js-yaml": "^3.14.0", - "lodash": "^4.17.19", - "lodash.clonedeep": "^4.5.0", - "request": "^2.88.2", - "source-map": "0.6.0", - "sway": "^2.0.5", - "traverse": "^0.6.6", - "urijs": "^1.19.5", - "xml2js": "^0.4.23" - }, - "bin": { - "api-spec-converter": "bin/api-spec-converter" - }, - "engines": { - "node": ">=6.0.0" - }, - "optionalDependencies": { - "apib2swagger": "^1.9.0", - "drafter.js": "^2.6.7", - "google-discovery-to-swagger": "^2.0.0", - "raml-parser": "^0.8.18", - "raml-to-swagger": "^1.1.0", - "swagger-converter": "^1.5.1", - "swagger2openapi": "2.9.*" - } - }, - "node_modules/apib-include-directive": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/apib-include-directive/-/apib-include-directive-0.1.0.tgz", - "integrity": "sha512-7m5LKbmFGeJogORhkLOCQjcEuGrRcVLG32nHbTAAYjvZ3cSV1XaxU8LBXIvx0PyLYL4mE/gc0Nu0Y7odQmAU1Q==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/apib2swagger": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/apib2swagger/-/apib2swagger-1.17.1.tgz", - "integrity": "sha512-2ednp+ckytSEOvX3CaUcHYC01wmzzfy970T22EJiBzcl4rj5p5UvUxXxHh6gCSCmDTkqKdiIFCLhoIJGynN8CQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "apib-include-directive": "^0.1.0", - "drafter.js": "^2.6.2", - "generate-schema": "^2.5.0", - "js-yaml": "^4.1.0", - "json-schema-to-openapi-schema": "^0.4.0", - "lodash.isequal": "^4.5.0", - "nopt": "^3.0.6", - "uritemplate": "^0.3.4" - }, - "bin": { - "apib2swagger": "bin/apib2swagger.js" - } - }, - "node_modules/apib2swagger/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0", - "optional": true - }, - "node_modules/apib2swagger/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", @@ -1756,33 +1623,6 @@ "printable-characters": "^1.0.42" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/ast-types": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", @@ -1816,13 +1656,6 @@ "node": ">= 0.4" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -1839,23 +1672,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1863,23 +1679,6 @@ "dev": true, "license": "MIT" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", @@ -1961,31 +1760,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2027,16 +1801,6 @@ "node": ">=18" } }, - "node_modules/cjson": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cjson/-/cjson-0.2.1.tgz", - "integrity": "sha512-Yche6o3bxUlXx6vGDjDwcWU3cSLGyRxGQpDk/FNHKDt02c715rBvuPLBfP1/+U+quWm/lU4F8N5sZbRCxpsrIg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.3.0" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -2059,29 +1823,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2102,44 +1843,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha512-XjsuUwpDeY98+yz959OlUK6m7mLBM+1MEG5oaenfuQnNnrQk1WvtcvFgN3FNDP3f2NmZ211t0mNEfSEN1h0eIg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/common-prefix": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/common-prefix/-/common-prefix-1.1.0.tgz", - "integrity": "sha512-9HAWgTP6U7K4G94u3J/oETIczTkzqZGn/cVFHDKVh/iFtZPBxuJ/qT+8Q5Np1XSXMZsRgnrpes7SrWOTJxFtaw==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2147,23 +1850,6 @@ "dev": true, "license": "MIT" }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/composite-error": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/composite-error/-/composite-error-0.1.1.tgz", - "integrity": "sha512-uKfFK2AO3V4YrzwnWYs0zO6jhfLScr30RoQ6iqG62iWXkp0G5w/Fx8W3y9ax5nwrlKzvTQzk1K6ODvChkwhCFA==", - "dev": true, - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2171,56 +1857,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true, - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-uri-to-buffer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", @@ -2282,37 +1918,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-sort-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/deep-sort-object/-/deep-sort-object-1.0.2.tgz", - "integrity": "sha512-Ko2XVMhRhz5Mxyb+QhLX13SHgcK1vuxc6XEfOyTMlbRbv7bhSmMqUw4ywqRwKgV25W+FDIaZjPWQrdblHCTwdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.1" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -2349,16 +1954,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", @@ -2369,28 +1964,6 @@ "node": ">= 0.6.0" } }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/drafter.js": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/drafter.js/-/drafter.js-2.6.7.tgz", - "integrity": "sha512-B6/nqEr3B9N8B4eySiPVXnFvI9Fh62Xl6GBQVncoh1aDcnYxSME5S8nZEERd4LjSYLzZchqnEC0F4oaXhSRJtA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2406,39 +1979,6 @@ "node": ">= 0.4" } }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ebnf-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/ebnf-parser/-/ebnf-parser-0.1.10.tgz", - "integrity": "sha512-urvSxVQ6XJcoTpc+/x2pWhhuOX4aljCNQpwzw+ifZvV1andZkAmiJc3Rq1oGEAQmcjiLceyMXOy1l8ms8qs2fQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2471,17 +2011,6 @@ "node": ">=0.10.0" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/env-paths": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", @@ -2498,17 +2027,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", @@ -2668,14 +2186,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2686,65 +2196,6 @@ "node": ">=6" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -2752,17 +2203,6 @@ "dev": true, "license": "MIT" }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -2773,34 +2213,6 @@ "node": ">=6" } }, - "node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/expr-eval-fork": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/expr-eval-fork/-/expr-eval-fork-3.0.3.tgz", @@ -2811,30 +2223,6 @@ "node": ">=16.9.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/faker": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", - "integrity": "sha512-ILKg69P6y/D8/wSmDXw35Ly0re8QzQ8pMfBCflsGiZG2ZjMUNLYNexA6lz5pkmJlepVdsiDFUxYAzPQ9/+iGLA==", - "dev": true, - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2859,13 +2247,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, "node_modules/fast-memoize": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", @@ -2873,13 +2254,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" - }, "node_modules/fast-string-truncated-width": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", @@ -2947,20 +2321,6 @@ "node": ">=8" } }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -2977,70 +2337,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/formidable": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", - "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0", - "qs": "^6.11.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/formidable/node_modules/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -3119,21 +2415,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generate-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/generate-schema/-/generate-schema-2.6.0.tgz", - "integrity": "sha512-EUBKfJNzT8f91xUk5X5gKtnbdejZeE065UAJ3BCzE8VEbvwKI9Pm5jaWmqVeK1MYc1g5weAVFDTSJzN7ymtTqA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "commander": "^2.9.0", - "type-of-is": "^3.4.0" - }, - "bin": { - "generate-schema": "bin/generate-schema" - } - }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -3227,17 +2508,6 @@ "node": ">=0.10.0" } }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -3256,16 +2526,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3356,23 +2616,6 @@ "node": ">=8.6.0" } }, - "node_modules/google-discovery-to-swagger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/google-discovery-to-swagger/-/google-discovery-to-swagger-2.1.0.tgz", - "integrity": "sha512-MI1gfmWPkuXCp6yH+9rfd8ZG8R1R5OIyY4WlKDTqr2+ere1gt2Ne4DSEu8HM7NkwKpuVCE5TrTRAPfm3ownMUQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "json-schema-compatibility": "^1.1.0", - "jsonpath": "^1.0.2", - "lodash": "^4.17.15", - "mime-db": "^1.21.0", - "mime-lookup": "^0.0.2", - "traverse": "~0.6.6", - "urijs": "^1.17.0" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3386,39 +2629,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/got/-/got-2.4.0.tgz", - "integrity": "sha512-FZ9t9NbPnhVEVPxjoRJuZUi6qmVlzBfSqS+FCU7npZLrTllzFeUAT1D79oz2n44qYM/Moz6eBFB9yzyKgZmHXg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "duplexify": "^3.2.0", - "infinity-agent": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "object-assign": "^2.0.0", - "prepend-http": "^1.0.0", - "read-all-stream": "^1.0.0", - "statuses": "^1.2.1", - "timed-out": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/got/node_modules/object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3426,65 +2636,6 @@ "dev": true, "license": "ISC" }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -3579,14 +2730,6 @@ "node": ">= 0.4" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/hpagent": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", @@ -3597,30 +2740,6 @@ "node": ">=14" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http-status-codes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-1.4.0.tgz", - "integrity": "sha512-JrT3ua+WgH8zBD3HEJYbeEgnuQaAnUeRRko/YojPAJjGmIfGD3KPU/asLdsLwKjfxOmQe5nXMQ0pt/7MyapVbQ==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", @@ -3659,14 +2778,6 @@ "url": "https://opencollective.com/immer" } }, - "node_modules/infinity-agent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-1.0.2.tgz", - "integrity": "sha512-QVet+evQIBtn+Cd+8nL1M8pOmBTzShfsQCgaXJoA+dV0UtKMnTPnkkkgXkM5eM+oC1qTv9UDew/LL9ElxiA/MQ==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3701,17 +2812,6 @@ "node": ">= 0.4" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -3730,14 +2830,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -3990,19 +3082,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -4074,17 +3153,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", @@ -4136,13 +3204,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -4202,147 +3263,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/jgexml": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/jgexml/-/jgexml-0.3.9.tgz", - "integrity": "sha512-OiucENxrgrQ0HgBhb0LewMeubJsOdKwoauSJsSk0eXBnXupW+RmeGvAcC5agdFw+V5f+OAIwmgvutOQAwnPZfw==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/jison": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/jison/-/jison-0.4.13.tgz", - "integrity": "sha512-H/r8t7Ft4zuGyQZUI0Ai2rh6WAHJoAGG1kJhI1MGKfgFO2/mqnxr9JmYMU/LcC95+DxO2bGqVXv5LDRiv06eRA==", - "dev": true, - "optional": true, - "dependencies": { - "cjson": "~0.2.1", - "ebnf-parser": "~0.1.9", - "escodegen": "0.0.21", - "esprima": "1.0.x", - "jison-lex": "0.2.x", - "JSONSelect": "0.4.0", - "lex-parser": "~0.1.3", - "nomnom": "1.5.2" - }, - "bin": { - "jison": "lib/cli.js" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/jison-lex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/jison-lex/-/jison-lex-0.2.1.tgz", - "integrity": "sha512-WCNVPRxaTWdhwJAIrBsgkGT9n6H1yNR9Lfof5LUHaMul24ySrJ1SXbVPszZfs57jwXvASLWBpd0xpFEW2oIuVA==", - "dev": true, - "optional": true, - "dependencies": { - "lex-parser": "0.1.x", - "nomnom": "1.5.2" - }, - "bin": { - "jison-lex": "cli.js" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/jison/node_modules/escodegen": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.21.tgz", - "integrity": "sha512-BQL5g+BqyrM5HRAKt4Q4YuH9CqiEcIHWSJ8fg2PRNkGkXn/LgzeDCZzDDSX4UiljSAHgXaHgOZREQ2xOigbLzA==", - "dev": true, - "optional": true, - "dependencies": { - "esprima": "~1.0.2", - "estraverse": "~0.0.4" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.4.0" - }, - "optionalDependencies": { - "source-map": ">= 0.1.2" - } - }, - "node_modules/jison/node_modules/esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", - "dev": true, - "optional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jison/node_modules/estraverse": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-0.0.4.tgz", - "integrity": "sha512-21DfBCsFJGb3HZr0vEBH1Wk1tGSbbzA8I/xtSSoy/pRtupHv0OgBmObcNGXM3ec6/pOXTOOUYY9/5bfluzz0sw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jju": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.2.1.tgz", - "integrity": "sha512-GpUVIrMsjtyZ3YDSIM3w3UGDZKjeVmIv9mW+KYnxDhovh9GnPjucVp13mdxiZmcZxjbenRAFs4gWEQIVXXvoYw==", - "dev": true, - "license": "WTFPL", - "optional": true - }, - "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4350,153 +3270,17 @@ "dev": true, "license": "MIT" }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" - }, "node_modules/jsep": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } }, - "node_modules/json-refs": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz", - "integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "~4.1.1", - "graphlib": "^2.1.8", - "js-yaml": "^3.13.1", - "lodash": "^4.17.15", - "native-promise-only": "^0.8.1", - "path-loader": "^1.0.10", - "slash": "^3.0.0", - "uri-js": "^4.2.2" - }, - "bin": { - "json-refs": "bin/json-refs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/json-refs/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/json-refs/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-compatibility": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/json-schema-compatibility/-/json-schema-compatibility-1.1.0.tgz", - "integrity": "sha512-/ZDuZvZFAi9XnuVQHdUlUvHSxN/ksFn8KDVHiLUJWumpRagccER/tRNY1GKNMguYdJCjaTZweTjf1faugxFfjw==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/json-schema-faker": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", - "integrity": "sha512-fNKLHgDvfGNNTX1zqIjqFMJjCLzJ2kvnJ831x4aqkAoeE4jE2TxvpJdhOnk3JU3s42vFzmXvkpbYzH5H3ncAzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-schema-ref-parser": "^6.1.0", - "jsonpath-plus": "^10.3.0" - }, - "bin": { - "jsf": "bin/gen.cjs" - } - }, - "node_modules/json-schema-faker/node_modules/json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "dev": true, - "license": "MIT", - "dependencies": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" - } - }, - "node_modules/json-schema-ref-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-3.3.1.tgz", - "integrity": "sha512-stQTMhec2R/p2L9dH4XXRlpNCP0mY8QrLd/9Kl+8SHJQmwHtE1nDfXH4wbsSM+GkJMl8t92yZbI0OIol432CIQ==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "debug": "^3.0.0", - "es6-promise": "^4.1.1", - "js-yaml": "^3.9.1", - "ono": "^4.0.2", - "z-schema": "^3.18.2" - } - }, - "node_modules/json-schema-to-openapi-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema-to-openapi-schema/-/json-schema-to-openapi-schema-0.4.0.tgz", - "integrity": "sha512-/DY8s4l28M5ZIJBhmcUFWbZChJV5v7RCA7RMVxubyD1l5KwIceUq6+EUnqQ2q3wh/2D3Zn8bNSeAu1i2X+sMHQ==", - "deprecated": "This package is no longer maintained. Use @openapi-contrib/json-schema-to-openapi-schema instead.", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@cloudflare/json-schema-walker": "^0.1.1" - } - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4504,13 +3288,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, "node_modules/jsonc-parser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", @@ -4531,19 +3308,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonpath": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.3.0.tgz", - "integrity": "sha512-0kjkYHJBkAy50Z5QzArZ7udmvxrJzkpKYW27fiF//BrMY7TQibYLl+FYIXN2BiYmwMIVzSfD8aDRj6IzgBX2/w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "esprima": "1.2.5", - "static-eval": "2.1.1", - "underscore": "1.13.6" - } - }, "node_modules/jsonpath-plus": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz", @@ -4563,20 +3327,6 @@ "node": ">=18.0.0" } }, - "node_modules/jsonpath/node_modules/esprima": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", - "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", - "dev": true, - "optional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", @@ -4587,46 +3337,6 @@ "node": ">=0.10.0" } }, - "node_modules/JSONSelect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz", - "integrity": "sha512-VRLR3Su35MH+XV2lrvh9O7qWoug/TUyj9tLDjn9rtpUCNnILLrHjgd/tB0KrhugCxUpj3UqoLqfYb3fLJdIQQQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.7" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -4637,46 +3347,6 @@ "node": ">=6" } }, - "node_modules/lex-parser": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/lex-parser/-/lex-parser-0.1.4.tgz", - "integrity": "sha512-DuAEISsr1H4LOpmFLkyMc8YStiRWZCO8hMsoXAXSbgyfvs2WQhSt0+/FBv3ZU/JBFZMGcE+FWzEBSzwUU7U27w==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", @@ -4684,29 +3354,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.topath": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", @@ -4714,37 +3361,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -4772,20 +3388,6 @@ "node": ">= 0.4" } }, - "node_modules/mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4796,16 +3398,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -4820,83 +3412,17 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-lookup": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/mime-lookup/-/mime-lookup-0.0.2.tgz", - "integrity": "sha512-6384dzMc9tsk9wBt/W9jG1hWEUPk7oPwj0ExsJCAI9peB11GbWniOWg0O/Uf8vZbvK8bkPKPtaVDtZI0FWlwbg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "node": "*" } }, "node_modules/minipass": { @@ -4922,13 +3448,6 @@ "node": ">= 18" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", @@ -4949,13 +3468,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", - "dev": true, - "license": "MIT" - }, "node_modules/nimma": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz", @@ -4997,25 +3509,6 @@ } } }, - "node_modules/node-readfiles": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", - "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es6-promise": "^3.2.1" - } - }, - "node_modules/node-readfiles/node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/node-sarif-builder": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-2.0.3.tgz", @@ -5030,116 +3523,6 @@ "node": ">=14" } }, - "node_modules/nomnom": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.5.2.tgz", - "integrity": "sha512-fiVbT7BqxiQqjlR9U3FDGOSERFCKoXVCdxV2FwZuNN7/cmJ42iQx35nUFOAFDcyvemu9Adp+IlsCGlKQYLmBKw==", - "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", - "dev": true, - "optional": true, - "dependencies": { - "colors": "0.5.x", - "underscore": "1.1.x" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nomnom/node_modules/underscore": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz", - "integrity": "sha512-w4QtCHoLBXw1mjofIDoMyexaEdWGMedWNDhlWTtT1V1lCRqi65Pnoygkh6+WRdr+Bm8ldkBNkNeCsXGMlQS9HQ==", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -5194,32 +3577,6 @@ "wrappy": "1" } }, - "node_modules/ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "format-util": "^1.0.3" - } - }, - "node_modules/os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -5238,81 +3595,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5323,28 +3605,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-loader": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.12.tgz", - "integrity": "sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "native-promise-only": "^0.8.1", - "superagent": "^7.1.6" - } - }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -5352,37 +3612,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -5390,13 +3619,6 @@ "dev": true, "license": "MIT" }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5417,25 +3639,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pluralize": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.1.6.tgz", - "integrity": "sha512-UZuZBoEfkgswguqcjVu6V59DVrILlC7GjclesLS6SA+u/+esH/f1FBW+BtzSMAz1mENIlM0Eo/89AIjxAFidQA==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/pony-cause": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz", @@ -5456,17 +3659,6 @@ "node": ">= 0.4" } }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prettier": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", @@ -5490,72 +3682,10 @@ "dev": true, "license": "Unlicense" }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "integrity": "sha512-ijt0LhxWClXBtc1RCt8H0WhlZLAdVX26nWbpsJy+Hblmp81d2F/pFsvlrJhJDDruFHM+ECtxP0H0HzGSrARkwg==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", - "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -5573,195 +3703,6 @@ ], "license": "MIT" }, - "node_modules/raml-parser": { - "version": "0.8.18", - "resolved": "https://registry.npmjs.org/raml-parser/-/raml-parser-0.8.18.tgz", - "integrity": "sha512-WpKlKhxN7mXJ1Kf5/7f7+EMOsXNwjI4TbrY6TkbR+bzzdFMTjz8oqPJdDkr7gA+ow5vvzCfe16+tUhmSNnkcNQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "got": "~2.4.0", - "jju": "~1.2.0", - "json-schema-ref-parser": "^3.1.2", - "object-assign": "^4.1.0", - "pluralize": "~1.1.1", - "q": "0.9.7", - "uritemplate": "~0.3.4" - }, - "bin": { - "raml-parser": "bin/raml-parser" - } - }, - "node_modules/raml-to-swagger": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/raml-to-swagger/-/raml-to-swagger-1.1.0.tgz", - "integrity": "sha512-aDsSklVNG1xOAXenzmX8+Pfq+G95esQNx5WQo/qa/AtVPm3KsM6zI6hw3oYE6whocfnogwpnbJSFbTrADwpZIg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "http-status-codes": "^1.0.5", - "json-schema-compatibility": "^1.1.0", - "jsonpath": "^0.2.5", - "lodash": "^4.1.0", - "urijs": "^1.17.0" - }, - "bin": { - "raml2swagger": "bin/raml2swagger" - } - }, - "node_modules/raml-to-swagger/node_modules/escodegen": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", - "integrity": "sha512-6ioQhg16lFs5c7XJlJFXIDxBjO4yRvXC9yK6dLNNGuhI3a/fJukHanPF6qtpjGDgAFzI8Wuq3PSIarWmaOq/5A==", - "dev": true, - "optional": true, - "dependencies": { - "esprima": "~1.0.2", - "estraverse": "~1.3.0" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.4.0" - }, - "optionalDependencies": { - "source-map": ">= 0.1.2" - } - }, - "node_modules/raml-to-swagger/node_modules/escodegen/node_modules/esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", - "dev": true, - "optional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/raml-to-swagger/node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "dev": true, - "optional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/raml-to-swagger/node_modules/estraverse": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", - "integrity": "sha512-OkbCPVUu8D9tbsLcUR+CKFRBbhZlogmkbWaP3BPERlkqzWL5Q6IdTz6eUk+b5cid2MTaCqJb2nNRGoJ8TpfPrg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/raml-to-swagger/node_modules/jsonpath": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-0.2.12.tgz", - "integrity": "sha512-FnZhbj4Cr7/LNMIU8e9VWKMtrE/+/NMur/7maiW3uhAPI5qUcvf/hsR9zpjWBNzl2EkrW/NFyNUZ8V5sK7R/Fw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "esprima": "1.2.2", - "jison": "0.4.13", - "static-eval": "0.2.3", - "underscore": "1.7.0" - } - }, - "node_modules/raml-to-swagger/node_modules/static-eval": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.3.tgz", - "integrity": "sha512-tAlLR3cdYw5GOEJfGqsL3YqwwldzljwqoOJ/jjFMmNRI9/iqve9RX4XE3vJs1KKsQ+ECT1u9o7a6NonewRl1lg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escodegen": "~0.0.24" - } - }, - "node_modules/raml-to-swagger/node_modules/underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==", - "dev": true, - "optional": true - }, - "node_modules/read-all-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-1.0.2.tgz", - "integrity": "sha512-ZCvB3TY2z5hGzzNe7zotaFsuRt4ODw5o+EVjfDVwlFG3ihfTd0k8jy9ffWZ4V1tCm0UHscbiS9KYREaq8eGE1Q==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5806,39 +3747,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5859,14 +3767,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/reserved": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/reserved/-/reserved-0.1.2.tgz", @@ -5915,6 +3815,7 @@ "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -5976,13 +3877,6 @@ "dev": true, "license": "MIT" }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -6039,16 +3933,6 @@ "dev": true, "license": "MIT" }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, "node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", @@ -6062,14 +3946,6 @@ "node": ">=10" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -6119,97 +3995,6 @@ "node": ">= 0.4" } }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "node_modules/should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "should-type": "^1.4.0" - } - }, - "node_modules/should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "node_modules/should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "node_modules/should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -6312,16 +4097,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/source-map": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.0.tgz", - "integrity": "sha512-mTozplhTX4tLKIHYji92OTZzVyZvi+Z1qRZDeBvQFI2XUB89wrRoj/xXad3c9NZ1GPJXXRvB+k41PQCPTMC+aA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -6330,693 +4105,142 @@ "dev": true, "license": "MIT" }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0", - "optional": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0", - "optional": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stacktracey": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.2.0.tgz", "integrity": "sha512-ETyQEz+CzXiLjEbyJqpbp+/T79RQD/6wqFucRBIlVNZfYq2Ay7wbretD4cxpbymZlaPWx58aIhPEY1Cr8DlVvg==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "as-table": "^1.0.36", - "get-source": "^2.0.12" - } - }, - "node_modules/static-eval": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", - "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/superagent": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz", - "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==", - "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", - "dev": true, - "license": "MIT", - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.3", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.0.1", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.10.3", - "readable-stream": "^3.6.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=6.4.0 <13 || >=14" - } - }, - "node_modules/superagent/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/superagent/node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/superagent/node_modules/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/superagent/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swagger-converter": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/swagger-converter/-/swagger-converter-1.5.1.tgz", - "integrity": "sha512-u98/Gt+fAnS95WoUDgWuOiN8MymrNCUdcLoD4Q6szy4nAj9BPCVRzwvJauqqj7+jKcB1ZEKf9vacQKSXEr3OBw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "common-prefix": "^1.1.0", - "urijs": "^1.16.1" - } - }, - "node_modules/swagger-methods": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.8.tgz", - "integrity": "sha512-G6baCwuHA+C5jf4FNOrosE4XlmGsdjbOjdBK4yuiDDj/ro9uR4Srj3OR84oQMT8F3qKp00tYNv0YN730oTHPZA==", - "deprecated": "This package is no longer being maintained.", - "dev": true, - "license": "MIT" - }, - "node_modules/swagger-schema-official": { - "version": "2.0.0-bab6bed", - "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", - "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", - "dev": true, - "license": "ISC" - }, - "node_modules/swagger2openapi": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-2.9.4.tgz", - "integrity": "sha512-dc9gxEkxuJYPz9y0Fx3ypsaiA2enxHxz7Q0tlyjJ01TopT2aR/EuxZhIWkslaN/Fx5FTT2OOSlP5VnvTbvIj+Q==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "ajv": "^5.0.1", - "call-me-maybe": "^1.0.1", - "co": "^4.6.0", - "jgexml": "^0.3.8", - "js-yaml": "^3.6.1", - "node-fetch": "^1.6.3", - "node-readfiles": "^0.2.0", - "should": "^13.0.1", - "yargs": "^9.0.1" - }, - "bin": { - "swagger2openapi": "swagger2openapi.js" - } - }, - "node_modules/swagger2openapi/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/swagger2openapi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/swagger2openapi/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/swagger2openapi/node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/swagger2openapi/node_modules/cliui/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/swagger2openapi/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/swagger2openapi/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/swagger2openapi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/swagger2openapi/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/swagger2openapi/node_modules/node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "license": "MIT", - "optional": true, + "dev": true, + "license": "Unlicense", "dependencies": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "as-table": "^1.0.36", + "get-source": "^2.0.12" } }, - "node_modules/swagger2openapi/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/swagger2openapi/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/swagger2openapi/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ansi-regex": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/swagger2openapi/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ansi-regex": "^2.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swagger2openapi/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swagger2openapi/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "number-is-nan": "^1.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swagger2openapi/node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/swagger2openapi/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/swagger2openapi/node_modules/yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha512-XS0NJoM9Iz0azh1cdgfLF5VFK6BSWfrrqA0V2tIx3fV6aGrWCseVDwOkIBg746ev0hes59od5ZvQAfdET4H0pw==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "node_modules/swagger2openapi/node_modules/yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==", - "dev": true, - "license": "ISC", - "optional": true, "dependencies": { - "camelcase": "^4.1.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/sway": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/sway/-/sway-2.0.6.tgz", - "integrity": "sha512-0HRT2WuU44XIdq+eCiMx67Bl/kiEKORP+4j+Wt89rFjoR5Dwx2hmU4PkMA6hnd48XLfS50olIac3pQGrV/wv7w==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "faker": "^4.1.0", - "js-base64": "^2.4.5", - "js-yaml": "^3.13.1", - "json-refs": "^3.0.13", - "json-schema-faker": "^0.5.0-rc16", - "lodash": "^4.17.10", - "native-promise-only": "^0.8.1", - "path-to-regexp": "^1.7.0", - "swagger-methods": "^1.0.0", - "swagger-schema-official": "2.0.0-bab6bed", - "z-schema": "^3.22.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/tar": { @@ -7060,17 +4284,6 @@ "dev": true, "license": "MIT" }, - "node_modules/timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7084,20 +4297,6 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -7105,24 +4304,6 @@ "dev": true, "license": "MIT" }, - "node_modules/traverse": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz", - "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==", - "dev": true, - "license": "MIT", - "dependencies": { - "gopd": "^1.2.0", - "typedarray.prototype.slice": "^1.0.5", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -7130,37 +4311,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/type-of-is": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/type-of-is/-/type-of-is-3.5.1.tgz", - "integrity": "sha512-SOnx8xygcAh8lvDU2exnK2bomASfNjzB3Qz71s2tw9QnX8fkAo7aC+D0H7FV0HjRKj94CKV2Hi71kVkkO6nOxg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.5" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -7239,29 +4389,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray.prototype.slice": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz", - "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "math-intrinsics": "^1.1.0", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-offset": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -7281,14 +4408,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/undici-types": { "version": "7.19.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", @@ -7319,16 +4438,6 @@ "node": ">= 10.0.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/urijs": { "version": "1.19.11", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", @@ -7336,20 +4445,6 @@ "dev": true, "license": "MIT" }, - "node_modules/uritemplate": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/uritemplate/-/uritemplate-0.3.4.tgz", - "integrity": "sha512-enADBvHfhjrwxFMTVWeIIYz51SZ91uC6o2MR/NQTVljJB6HTZ8eQL3Q7JBj3RxNISA14MOwJaU3vpf5R6dyxHA==", - "dev": true, - "optional": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, "node_modules/utility-types": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", @@ -7360,29 +4455,6 @@ "node": ">= 4" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", @@ -7393,38 +4465,6 @@ "builtins": "^1.0.3" } }, - "node_modules/validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -7491,20 +4531,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/which-boxed-primitive": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", @@ -7579,14 +4605,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/which-typed-array": { "version": "1.1.20", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", @@ -7634,30 +4652,6 @@ "dev": true, "license": "ISC" }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -7738,25 +4732,6 @@ "node": ">=12" } }, - "node_modules/z-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz", - "integrity": "sha512-7tDlwhrBG+oYFdXNOjILSurpfQyuVgkRe3hB2q8TEssamDHB7BbLWYkYO98nTn0FibfdFroFKDjndbgufAgS/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^2.5.7", - "lodash.get": "^4.0.0", - "lodash.isequal": "^4.0.0", - "validator": "^10.0.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "optionalDependencies": { - "commander": "^2.7.1" - } - }, "node_modules/zod": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", diff --git a/package.json b/package.json index 206c78d..1069cf4 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,13 @@ { "name": "hyperfleet", - "version": "0.1.0", + "version": "1.0.18", "type": "module", - "private": true, + "exports": { + "./*": "./*" + }, "packageManager": "npm@11.6.2+sha512.ee22b335fcbc95662cdf3ab8a053daf045d9cf9c6df6040d28965abb707512b2c16fa6c5eec049d34c74f78f390cebd14f697919eadb97756564d4f9eccc4954", "scripts": { - "build": "./build-schema.sh", - "build:core": "./build-schema.sh core", - "build:gcp": "./build-schema.sh gcp", - "build:core:swagger": "./build-schema.sh core --swagger", - "build:gcp:swagger": "./build-schema.sh gcp --swagger", - "build:all": "./build-schema.sh core --swagger && ./build-schema.sh gcp --swagger" + "build": "./build-schema.sh" }, "devDependencies": { "@stoplight/spectral-cli": "6.15.1", @@ -19,7 +16,6 @@ "@typespec/openapi": "^1.6.0", "@typespec/openapi3": "^1.6.0", "@typespec/rest": "^0.81.0", - "@typespec/versioning": "^0.81.0", - "api-spec-converter": "^2.12.0" + "@typespec/versioning": "^0.81.0" } } diff --git a/schemas/core/openapi.yaml b/schemas/core/openapi.yaml index d36e851..91f034a 100644 --- a/schemas/core/openapi.yaml +++ b/schemas/core/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.0.0 info: title: HyperFleet API - version: 1.0.17 + version: 1.0.18 contact: name: HyperFleet Team url: https://github.com/openshift-hyperfleet @@ -15,11 +15,11 @@ info: Sentinel operator handles all orchestration logic. Adapters handle the specifics of managing spec tags: - - name: Clusters - name: Cluster statuses - name: NodePool statuses - name: Resource statuses - name: Resources + - name: Clusters - name: NodePools paths: /api/hyperfleet/v1/clusters: @@ -578,6 +578,46 @@ paths: security: - BearerAuth: [] /api/hyperfleet/v1/clusters/{cluster_id}/nodepools/{nodepool_id}/statuses: + put: + operationId: putNodePoolStatuses + summary: Adapter creates or updates nodepool status + description: Adapters call this endpoint to report the status for a nodepool after each evaluation. The adapter's status entry is created if it doesn't exist, or updated if it does (upserted by adapter name). This allows HyperFleet to aggregate multiple adapter perspectives into a unified nodepool status. + parameters: + - name: cluster_id + in: path + required: true + description: Cluster ID + schema: + type: string + - name: nodepool_id + in: path + required: true + description: NodePool ID + schema: + type: string + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/AdapterStatus' + '400': + description: The server could not understand the request due to invalid syntax. + '404': + description: The server cannot find the requested resource. + '409': + description: The request conflicts with the current state of the server. + tags: + - NodePool statuses + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AdapterStatusCreateRequest' + security: + - BearerAuth: [] get: operationId: getNodePoolsStatuses summary: List all adapter statuses for nodepools @@ -616,12 +656,11 @@ paths: $ref: '#/components/schemas/Error' tags: - NodePool statuses - security: - - BearerAuth: [] + /api/hyperfleet/v1/clusters/{cluster_id}/statuses: put: - operationId: putNodePoolStatuses - summary: Adapter creates or updates nodepool status - description: Adapters call this endpoint to report the status for a nodepool after each evaluation. The adapter's status entry is created if it doesn't exist, or updated if it does (upserted by adapter name). This allows HyperFleet to aggregate multiple adapter perspectives into a unified nodepool status. + operationId: putClusterStatuses + summary: Adapter creates or updates cluster status + description: Adapters call this endpoint to report the status for a cluster after each evaluation. The adapter's status entry is created if it doesn't exist, or updated if it does (upserted by adapter name). This allows HyperFleet to aggregate multiple adapter perspectives into a unified cluster status. parameters: - name: cluster_id in: path @@ -629,12 +668,6 @@ paths: description: Cluster ID schema: type: string - - name: nodepool_id - in: path - required: true - description: NodePool ID - schema: - type: string responses: '201': description: The request has succeeded and a new resource has been created as a result. @@ -649,7 +682,7 @@ paths: '409': description: The request conflicts with the current state of the server. tags: - - NodePool statuses + - Cluster statuses requestBody: required: true content: @@ -658,7 +691,6 @@ paths: $ref: '#/components/schemas/AdapterStatusCreateRequest' security: - BearerAuth: [] - /api/hyperfleet/v1/clusters/{cluster_id}/statuses: get: operationId: getClusterStatuses summary: List all adapter statuses for cluster @@ -690,40 +722,6 @@ paths: - Cluster statuses security: - BearerAuth: [] - put: - operationId: putClusterStatuses - summary: Adapter creates or updates cluster status - description: Adapters call this endpoint to report the status for a cluster after each evaluation. The adapter's status entry is created if it doesn't exist, or updated if it does (upserted by adapter name). This allows HyperFleet to aggregate multiple adapter perspectives into a unified cluster status. - parameters: - - name: cluster_id - in: path - required: true - description: Cluster ID - schema: - type: string - responses: - '201': - description: The request has succeeded and a new resource has been created as a result. - content: - application/json: - schema: - $ref: '#/components/schemas/AdapterStatus' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - tags: - - Cluster statuses - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/AdapterStatusCreateRequest' - security: - - BearerAuth: [] /api/hyperfleet/v1/nodepools: get: operationId: getNodePools @@ -963,73 +961,73 @@ paths: security: - BearerAuth: [] /api/hyperfleet/v1/resources/{resource_id}/statuses: - get: - operationId: getResourceStatuses - summary: List resource statuses - description: Returns adapter statuses for a resource. + put: + operationId: putResourceStatuses + summary: Adapter creates or updates resource status + description: Adapters call this endpoint to report status for a resource after each evaluation. The adapter's status entry is created if it doesn't exist, or updated if it does (upserted by adapter name). parameters: - name: resource_id in: path required: true schema: type: string - - $ref: '#/components/parameters/SearchParams' - - $ref: '#/components/parameters/QueryParams.page' - - $ref: '#/components/parameters/QueryParams.pageSize' - - $ref: '#/components/parameters/QueryParams.orderBy' - - $ref: '#/components/parameters/QueryParams.order' responses: - '200': - description: The request has succeeded. + '201': + description: The request has succeeded and a new resource has been created as a result. content: application/json: schema: - $ref: '#/components/schemas/AdapterStatusList' + $ref: '#/components/schemas/AdapterStatus' '400': description: The server could not understand the request due to invalid syntax. '404': description: The server cannot find the requested resource. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' + '409': + description: The request conflicts with the current state of the server. tags: - Resource statuses + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AdapterStatusCreateRequest' security: - BearerAuth: [] - put: - operationId: putResourceStatuses - summary: Adapter creates or updates resource status - description: Adapters call this endpoint to report status for a resource after each evaluation. The adapter's status entry is created if it doesn't exist, or updated if it does (upserted by adapter name). + get: + operationId: getResourceStatuses + summary: List resource statuses + description: Returns adapter statuses for a resource. parameters: - name: resource_id in: path required: true schema: type: string + - $ref: '#/components/parameters/SearchParams' + - $ref: '#/components/parameters/QueryParams.page' + - $ref: '#/components/parameters/QueryParams.pageSize' + - $ref: '#/components/parameters/QueryParams.orderBy' + - $ref: '#/components/parameters/QueryParams.order' responses: - '201': - description: The request has succeeded and a new resource has been created as a result. + '200': + description: The request has succeeded. content: application/json: schema: - $ref: '#/components/schemas/AdapterStatus' + $ref: '#/components/schemas/AdapterStatusList' '400': description: The server could not understand the request due to invalid syntax. '404': description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. + default: + description: An unexpected error response. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Error' tags: - Resource statuses - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/AdapterStatusCreateRequest' security: - BearerAuth: [] components: diff --git a/schemas/core/swagger.yaml b/schemas/core/swagger.yaml deleted file mode 100644 index ff67847..0000000 --- a/schemas/core/swagger.yaml +++ /dev/null @@ -1,2571 +0,0 @@ -swagger: '2.0' -info: - contact: - name: HyperFleet Team - url: 'https://github.com/openshift-hyperfleet' - description: >- - HyperFleet API provides simple CRUD operations for managing cluster - resources and their status history. - - - **Architecture**: Simple CRUD only, no business logic, no event creation. - - Sentinel operator handles all orchestration logic. - - Adapters handle the specifics of managing spec - license: - name: Apache 2.0 - url: 'https://www.apache.org/licenses/LICENSE-2.0' - title: HyperFleet API - version: 1.0.17 -host: hyperfleet.redhat.com -basePath: / -schemes: - - https -paths: - /api/hyperfleet/v1/clusters: - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/ClusterList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: Returns a list of all clusters. - operationId: getClusters - summary: List clusters - post: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ClusterCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: >- - Create a new cluster resource. - - - **Note**: The `status` object in the response is read-only and computed - by the service. - - It is NOT part of the request body. Initially, - - status.conditions will include mandatory "LastKnownReconciled" and - "Reconciled" conditions. - operationId: postCluster - summary: Create cluster - '/api/hyperfleet/v1/clusters/{cluster_id}': - delete: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: cluster_id - required: true - type: string - responses: - '202': - description: >- - The request has been accepted for processing, but processing has not - yet completed. - examples: - application/json: - created_by: user-123@example.com - created_time: '2021-01-01T00:00:00Z' - deleted_by: user-123@example.com - deleted_time: '2021-01-01T10:05:00Z' - generation: 2 - href: >- - https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - labels: - environment: production - team: platform - name: cluster-123 - spec: {} - status: - conditions: - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters reported Available=True or - Finalized=True at the current generation - observed_generation: 2 - reason: ReconciledAll - status: 'True' - type: Reconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters report Available=True for the - tracked generation - observed_generation: 2 - reason: AllAdaptersReconciled - status: 'True' - type: LastKnownReconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: This adapter1 is available - observed_generation: 2 - reason: This adapter1 is available - status: 'True' - type: Adapter1Successful - - created_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - message: This adapter2 is available - observed_generation: 2 - reason: This adapter2 is available - status: 'True' - type: Adapter2Successful - updated_by: user-123@example.com - updated_time: '2021-01-01T10:02:00Z' - schema: - $ref: '#/definitions/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: >- - Marks the cluster for deletion by setting deleted_time to the current - time, cascades to its nodepools. - - The cluster remains in the database until it is fully deleted. - - Returns the updated cluster with generation incremented. - operationId: deleteClusterById - summary: Request cluster deletion - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - in: path - name: cluster_id - required: true - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: Returns a single cluster by its ID. - operationId: getClusterById - summary: Get cluster by ID - patch: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ClusterPatchRequest' - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: Patch a specific cluster by ID - operationId: patchClusterById - summary: Patch cluster by ID - '/api/hyperfleet/v1/clusters/{cluster_id}/force-delete': - post: - consumes: - - application/json - produces: - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ForceDeleteRequest' - responses: - '204': - description: >- - There is no content to send for this request, but the headers may be - useful. - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: >- - Permanently removes the cluster record from the database for a cluster - stuck in Finalizing state. - - This is a database-only operation. Requires a reason for audit purposes. - operationId: forceDeleteCluster - summary: Force-delete a cluster - '/api/hyperfleet/v1/clusters/{cluster_id}/nodepools': - get: - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/NodePoolList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Returns the list of all nodepools for a cluster - operationId: getNodePoolsByClusterId - summary: List all nodepools for cluster - post: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/NodePoolCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/NodePoolCreateResponse' - '400': - description: The server could not understand the request due to invalid syntax. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Create a NodePool for a cluster - operationId: createNodePool - summary: Create nodepool - '/api/hyperfleet/v1/clusters/{cluster_id}/nodepools/{nodepool_id}': - delete: - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: NodePool ID - in: path - name: nodepool_id - required: true - type: string - responses: - '202': - description: >- - The request has been accepted for processing, but processing has not - yet completed. - examples: - application/json: - created_by: user-123@example.com - created_time: '2021-01-01T00:00:00Z' - deleted_by: user-123@example.com - deleted_time: '2021-01-01T10:05:00Z' - generation: 2 - href: >- - https://api.hyperfleet.com/v1/nodepools/019466a1-2b3c-7def-8abc-456789abcdef - id: 019466a1-2b3c-7def-8abc-456789abcdef - kind: NodePool - labels: - environment: production - pooltype: worker - name: worker-pool-1 - owner_references: - href: >- - https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - spec: {} - status: - conditions: - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters reported Available=True or - Finalized=True at the current generation - observed_generation: 2 - reason: ReconciledAll - status: 'True' - type: Reconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters report Available=True for the - tracked generation - observed_generation: 2 - reason: AllAdaptersReconciled - status: 'True' - type: LastKnownReconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: This adapter1 is available - observed_generation: 2 - reason: This adapter1 is available - status: 'True' - type: Adapter1Successful - - created_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - message: This adapter2 is available - observed_generation: 2 - reason: This adapter2 is available - status: 'True' - type: Adapter2Successful - updated_by: user-123@example.com - updated_time: '2021-01-01T10:02:00Z' - schema: - $ref: '#/definitions/NodePool' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: >- - Marks the nodepool for deletion by setting deleted_time and deleted_by. - Does not affect the parent cluster. - - Returns the updated nodepool with generation incremented. - operationId: deleteNodePoolById - summary: Request nodepool deletion - get: - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: NodePool ID - in: path - name: nodepool_id - required: true - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/NodePool' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Returns specific nodepool - operationId: getNodePoolById - summary: Get nodepool by ID - patch: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: NodePool ID - in: path - name: nodepool_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/NodePoolPatchRequest' - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/NodePool' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Patch a specific nodepool within a cluster - operationId: patchNodePoolById - summary: Patch nodepool by ID - '/api/hyperfleet/v1/clusters/{cluster_id}/nodepools/{nodepool_id}/force-delete': - post: - consumes: - - application/json - produces: - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: NodePool ID - in: path - name: nodepool_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ForceDeleteRequest' - responses: - '204': - description: >- - There is no content to send for this request, but the headers may be - useful. - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: >- - Permanently removes the nodepool record from the database for a nodepool - stuck in Finalizing state. - - This is a database-only operation. Requires a reason for audit purposes. - operationId: forceDeleteNodePool - summary: Force-delete a nodepool - '/api/hyperfleet/v1/clusters/{cluster_id}/nodepools/{nodepool_id}/statuses': - get: - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - in: path - name: nodepool_id - required: true - type: string - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/AdapterStatusList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePool statuses - description: Returns adapter status reports for this nodepool - operationId: getNodePoolsStatuses - summary: List all adapter statuses for nodepools - put: - consumes: - - application/json - produces: - - application/json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: NodePool ID - in: path - name: nodepool_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/AdapterStatusCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/AdapterStatus' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - security: - - BearerAuth: [] - tags: - - NodePool statuses - description: >- - Adapters call this endpoint to report the status for a nodepool after - each evaluation. The adapter's status entry is created if it doesn't - exist, or updated if it does (upserted by adapter name). This allows - HyperFleet to aggregate multiple adapter perspectives into a unified - nodepool status. - operationId: putNodePoolStatuses - summary: Adapter creates or updates nodepool status - '/api/hyperfleet/v1/clusters/{cluster_id}/statuses': - get: - produces: - - application/json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/AdapterStatusList' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - security: - - BearerAuth: [] - tags: - - Cluster statuses - description: Returns adapter status reports for this cluster - operationId: getClusterStatuses - summary: List all adapter statuses for cluster - put: - consumes: - - application/json - produces: - - application/json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/AdapterStatusCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/AdapterStatus' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - security: - - BearerAuth: [] - tags: - - Cluster statuses - description: >- - Adapters call this endpoint to report the status for a cluster after - each evaluation. The adapter's status entry is created if it doesn't - exist, or updated if it does (upserted by adapter name). This allows - HyperFleet to aggregate multiple adapter perspectives into a unified - cluster status. - operationId: putClusterStatuses - summary: Adapter creates or updates cluster status - /api/hyperfleet/v1/nodepools: - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/NodePoolList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Returns the list of all nodepools - operationId: getNodePools - summary: List all nodepools for cluster - /api/hyperfleet/v1/resources: - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/ResourceList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Returns a paginated list of all resources, optionally filtered by kind, - labels, or TSL query. - operationId: getResources - summary: List resources - post: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ResourceCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Create a new resource. Only top-level entity types (no parent) can be - created - - via this endpoint. Child entities must use the nested route under their - parent. - operationId: postResource - summary: Create resource - '/api/hyperfleet/v1/resources/{resource_id}': - delete: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: resource_id - required: true - type: string - responses: - '202': - description: >- - The request has been accepted for processing, but processing has not - yet completed. - schema: - $ref: '#/definitions/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Marks the resource for deletion. Child resources are handled per their - - OnParentDelete policy (cascade or restrict). Returns 409 if a - restrict-policy - - child exists or if another resource holds a reference to this one. - operationId: deleteResourceById - summary: Request resource deletion - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - in: path - name: resource_id - required: true - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: Returns a single resource by its ID. - operationId: getResourceById - summary: Get resource by ID - patch: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: resource_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ResourcePatchRequest' - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Patch a resource by ID. Supports partial updates to spec, labels, and - references. - operationId: patchResourceById - summary: Patch resource by ID - '/api/hyperfleet/v1/resources/{resource_id}/force-delete': - post: - consumes: - - application/json - produces: - - application/problem+json - parameters: - - in: path - name: resource_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ForceDeleteRequest' - responses: - '204': - description: >- - There is no content to send for this request, but the headers may be - useful. - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Permanently removes the resource record from the database for a resource - stuck in Finalizing state. - - This is a database-only operation. Requires a reason for audit purposes. - operationId: forceDeleteResource - summary: Force-delete a resource - '/api/hyperfleet/v1/resources/{resource_id}/statuses': - get: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: resource_id - required: true - type: string - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/AdapterStatusList' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resource statuses - description: Returns adapter statuses for a resource. - operationId: getResourceStatuses - summary: List resource statuses - put: - consumes: - - application/json - produces: - - application/json - parameters: - - in: path - name: resource_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/AdapterStatusCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/AdapterStatus' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - security: - - BearerAuth: [] - tags: - - Resource statuses - description: >- - Adapters call this endpoint to report status for a resource after each - evaluation. The adapter's status entry is created if it doesn't exist, - or updated if it does (upserted by adapter name). - operationId: putResourceStatuses - summary: Adapter creates or updates resource status -definitions: - AdapterCondition: - description: >- - Condition in AdapterStatus - - Used for standard Kubernetes condition types: "Available", "Applied", - "Health", "Finalized" - - Note: observed_generation is at AdapterStatus level, not per-condition, - - since all conditions in one AdapterStatus share the same observed - generation - properties: - last_transition_time: - description: >- - When this condition last transitioned status (API-managed) - - Only updated when status changes (True/False), not when reason/message - changes - format: date-time - type: string - message: - description: Human-readable message - type: string - reason: - description: Machine-readable reason code - type: string - status: - $ref: '#/definitions/AdapterConditionStatus' - type: - description: Condition type - type: string - required: - - type - - last_transition_time - - status - type: object - AdapterConditionStatus: - description: Status value for adapter conditions - enum: - - 'True' - - 'False' - - Unknown - type: string - AdapterStatus: - description: |- - AdapterStatus represents the complete status report from an adapter - Contains multiple conditions, job metadata, and adapter-specific data - example: - adapter: adapter1 - conditions: - - last_transition_time: '2021-01-01T10:00:00Z' - message: This adapter1 is available - reason: This adapter1 is available - status: 'True' - type: Available - - last_transition_time: '2021-01-01T10:00:00Z' - message: Adapter1 validation job applied successfully - reason: Validation job applied - status: 'True' - type: Applied - - last_transition_time: '2021-01-01T10:00:00Z' - message: All adapter1 runtime operations completed successfully - reason: All adapter1 operations completed successfully - status: 'True' - type: Health - - last_transition_time: '2021-01-01T10:00:00Z' - message: All resources deleted; cleanup confirmed - reason: All resources deleted; cleanup confirmed - status: 'True' - type: Finalized - created_time: '2021-01-01T10:00:00Z' - data: - validation_results: - failed: 0 - passed: 30 - total_tests: 30 - last_report_time: '2021-01-01T10:02:00Z' - metadata: - attempt: 1 - completed_time: '2021-01-01T10:02:00Z' - duration: 2m - job_name: validator-job-abc123 - job_namespace: hyperfleet-system - started_time: '2021-01-01T10:00:00Z' - observed_generation: 1 - properties: - adapter: - description: 'Adapter name (e.g., "validator", "dns", "provisioner")' - type: string - conditions: - description: |- - Kubernetes-style conditions tracking adapter state - Typically includes: Available, Applied, Health, Finalized - items: - $ref: '#/definitions/AdapterCondition' - type: array - created_time: - description: When this adapter status was first created (API-managed) - format: date-time - type: string - data: - additionalProperties: {} - description: Adapter-specific data (structure varies by adapter type) - type: object - last_report_time: - description: >- - When this adapter last reported its status (API-managed) - - Updated every time the adapter PUTs, even if conditions haven't - changed - - Used by Sentinel to detect adapter liveness - format: date-time - type: string - metadata: - description: Job execution metadata - properties: - attempt: - format: int32 - type: integer - completed_time: - format: date-time - type: string - duration: - type: string - job_name: - type: string - job_namespace: - type: string - started_time: - format: date-time - type: string - type: object - observed_generation: - description: Which generation of the resource this status reflects - format: int32 - type: integer - required: - - adapter - - observed_generation - - conditions - - created_time - - last_report_time - type: object - AdapterStatusCreateRequest: - description: Request payload for creating/updating adapter status - example: - adapter: validator - conditions: - - message: This adapter1 is available - reason: This adapter1 is available - status: 'True' - type: Available - - message: Adapter1 validation job applied successfully - reason: Validation job applied - status: 'True' - type: Applied - - message: All adapter1 runtime operations completed successfully - reason: All adapter1 operations completed successfully - status: 'True' - type: Health - - message: All resources deleted; cleanup confirmed - reason: All resources deleted; cleanup confirmed - status: 'True' - type: Finalized - data: - validation_results: - failed: 0 - passed: 30 - total_tests: 30 - metadata: - attempt: 1 - completed_time: '2021-01-01T10:02:00Z' - duration: 2m - job_name: validator-job-abc123 - job_namespace: hyperfleet-system - started_time: '2021-01-01T10:00:00Z' - observed_generation: 1 - observed_time: '2021-01-01T10:00:00Z' - properties: - adapter: - description: 'Adapter name (e.g., "validator", "dns", "provisioner")' - type: string - conditions: - items: - $ref: '#/definitions/ConditionRequest' - type: array - data: - additionalProperties: {} - description: Adapter-specific data (structure varies by adapter type) - type: object - metadata: - description: Job execution metadata - properties: - attempt: - format: int32 - type: integer - completed_time: - format: date-time - type: string - duration: - type: string - job_name: - type: string - job_namespace: - type: string - started_time: - format: date-time - type: string - type: object - observed_generation: - description: Which generation of the resource this status reflects - format: int32 - type: integer - observed_time: - description: |- - When the adapter observed this resource state - API will use this to set AdapterStatus.last_report_time - format: date-time - type: string - required: - - adapter - - observed_generation - - observed_time - - conditions - type: object - AdapterStatusList: - description: List of adapter statuses with pagination metadata - example: - items: - - adapter: adapter1 - conditions: - - last_transition_time: '2021-01-01T10:00:00Z' - message: This adapter1 is available - reason: This adapter1 is available - status: 'True' - type: Available - created_time: '2021-01-01T10:00:00Z' - last_report_time: '2021-01-01T10:02:00Z' - metadata: - duration: 2m - job_name: validator-job-abc123 - observed_generation: 1 - - adapter: adapter2 - conditions: - - last_transition_time: '2021-01-01T10:01:00Z' - message: This adapter2 is available - reason: This adapter2 is available - status: 'True' - type: Available - created_time: '2021-01-01T10:01:00Z' - last_report_time: '2021-01-01T10:01:30Z' - observed_generation: 1 - kind: AdapterStatusList - page: 1 - size: 2 - total: 2 - properties: - items: - items: - $ref: '#/definitions/AdapterStatus' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int32 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - BearerAuth: - properties: - scheme: - enum: - - bearer - type: string - type: - enum: - - http - type: string - required: - - type - - scheme - type: object - Cluster: - example: - created_by: user-123@example.com - created_time: '2021-01-01T00:00:00Z' - generation: 1 - href: >- - https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - labels: - environment: production - team: platform - name: cluster-123 - spec: {} - status: - conditions: - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters reported Available=True or Finalized=True at - the current generation - observed_generation: 1 - reason: ReconciledAll - status: 'True' - type: Reconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters report Available=True for the tracked - generation - observed_generation: 1 - reason: AllAdaptersReconciled - status: 'True' - type: LastKnownReconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: This adapter1 is available - observed_generation: 1 - reason: This adapter1 is available - status: 'True' - type: Adapter1Successful - - created_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - message: This adapter2 is available - observed_generation: 1 - reason: This adapter2 is available - status: 'True' - type: Adapter2Successful - updated_by: user-123@example.com - updated_time: '2021-01-01T10:02:00Z' - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - description: >- - Generation field is updated on customer updates, reflecting the - version of the "intent" of the customer - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: Cluster name (unique) - maxLength: 53 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - spec: - $ref: '#/definitions/ClusterSpec' - status: - $ref: '#/definitions/ClusterStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - status - type: object - ClusterCreateRequest: - example: - kind: Cluster - labels: - environment: production - team: platform - name: cluster-123 - spec: {} - properties: - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: Cluster name (unique) - maxLength: 53 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - spec: - $ref: '#/definitions/ClusterSpec' - required: - - name - - spec - type: object - ClusterList: - properties: - items: - items: - $ref: '#/definitions/Cluster' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int32 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - ClusterPatchRequest: - additionalProperties: false - example: - labels: - env: staging - spec: {} - minProperties: 1 - properties: - labels: - additionalProperties: - type: string - type: object - spec: - $ref: '#/definitions/ClusterSpec' - type: object - ClusterSpec: - description: |- - Core cluster specification. - Accepts any properties as the spec is provider-agnostic. - This is represented as a simple object to allow flexibility. - type: object - ClusterStatus: - description: >- - Cluster status computed from all status conditions. - - - This object is computed by the service and CANNOT be modified directly. - - It is aggregated from condition updates posted to - `/clusters/{id}/statuses`. - - - Provides quick overview of all reported conditions. - properties: - conditions: - description: >- - List of status conditions for the cluster. - - - **Mandatory conditions**: - - - `type: "Reconciled"`: Whether the resource's desired state has been - fully reconciled by all adapters at the current generation. - - - `type: "LastKnownReconciled"`: Sticky cross-generation condition — - stays True as long as all required adapters were reconciled at a - common observed generation, even if a newer generation is being - processed. - - - These conditions are present immediately upon resource creation. - items: - $ref: '#/definitions/ResourceCondition' - minItems: 2 - type: array - required: - - conditions - type: object - ConditionRequest: - description: >- - Condition data for create/update requests (from adapters) - - observed_generation and observed_time are now at - AdapterStatusCreateRequest level - properties: - message: - type: string - reason: - type: string - status: - $ref: '#/definitions/AdapterConditionStatus' - type: - type: string - required: - - type - - status - type: object - Error: - description: RFC 9457 Problem Details error format with HyperFleet extensions - properties: - code: - description: Machine-readable error code in HYPERFLEET-CAT-NUM format - example: HYPERFLEET-VAL-001 - type: string - detail: - description: Human-readable explanation specific to this occurrence - example: The cluster name field is required - type: string - errors: - description: Field-level validation errors (for validation failures) - items: - $ref: '#/definitions/ValidationError' - type: array - instance: - description: URI reference for this specific occurrence - example: /api/hyperfleet/v1/clusters - format: uri-reference - type: string - status: - description: HTTP status code - example: 400 - type: integer - timestamp: - description: RFC3339 timestamp of when the error occurred - example: '2024-01-15T10:30:00Z' - format: date-time - type: string - title: - description: Short human-readable summary of the problem - example: Validation Failed - type: string - trace_id: - description: Distributed trace ID for correlation - example: abc123def456 - type: string - type: - description: URI reference identifying the problem type - example: 'https://api.hyperfleet.io/errors/validation-error' - format: uri - type: string - required: - - type - - title - - status - type: object - ForceDeleteRequest: - description: Request body for force-delete operations - properties: - reason: - description: Reason for force-deleting the resource - maxLength: 1024 - minLength: 1 - type: string - required: - - reason - type: object - NodePool: - example: - created_by: user-123@example.com - created_time: '2021-01-01T00:00:00Z' - generation: 1 - href: >- - https://api.hyperfleet.com/v1/nodepools/019466a1-2b3c-7def-8abc-456789abcdef - id: 019466a1-2b3c-7def-8abc-456789abcdef - kind: NodePool - labels: - environment: production - pooltype: worker - name: worker-pool-1 - owner_references: - href: >- - https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - spec: {} - status: - conditions: - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters reported Available=True or Finalized=True at - the current generation - observed_generation: 1 - reason: ReconciledAll - status: 'True' - type: Reconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters report Available=True for the tracked - generation - observed_generation: 1 - reason: AllAdaptersReconciled - status: 'True' - type: LastKnownReconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: This adapter1 is available - observed_generation: 1 - reason: This adapter1 is available - status: 'True' - type: Adapter1Successful - - created_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - message: This adapter2 is available - observed_generation: 1 - reason: This adapter2 is available - status: 'True' - type: Adapter2Successful - updated_by: user-123@example.com - updated_time: '2021-01-01T10:02:00Z' - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - description: >- - Generation field is updated on customer updates, reflecting the - version of the "intent" of the customer - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: NodePool name (unique in a cluster) - maxLength: 15 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - owner_references: - $ref: '#/definitions/ObjectReference' - spec: - $ref: '#/definitions/NodePoolSpec' - status: - $ref: '#/definitions/NodePoolStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - owner_references - - status - type: object - NodePoolCreateRequest: - example: - labels: - environment: production - pooltype: worker - name: worker-pool-1 - spec: {} - properties: - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: NodePool name (unique in a cluster) - maxLength: 15 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - spec: - $ref: '#/definitions/NodePoolSpec' - required: - - name - - spec - type: object - NodePoolCreateResponse: - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - description: >- - Generation field is updated on customer updates, reflecting the - version of the "intent" of the customer - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: NodePool name (unique in a cluster) - maxLength: 15 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - owner_references: - $ref: '#/definitions/ObjectReference' - spec: - $ref: '#/definitions/NodePoolSpec' - status: - $ref: '#/definitions/NodePoolStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - owner_references - - status - type: object - NodePoolList: - properties: - items: - items: - $ref: '#/definitions/NodePool' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int32 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - NodePoolPatchRequest: - additionalProperties: false - example: - labels: - env: staging - spec: {} - minProperties: 1 - properties: - labels: - additionalProperties: - type: string - type: object - spec: - $ref: '#/definitions/NodePoolSpec' - type: object - NodePoolSpec: - description: |- - Core nodepool specification. - Accepts any properties as the spec is provider-agnostic. - This is represented as a simple object to allow flexibility. - type: object - NodePoolStatus: - description: |- - NodePool status computed from all status conditions. - - This object is computed by the service and CANNOT be modified directly. - properties: - conditions: - description: >- - List of status conditions for the nodepool. - - - **Mandatory conditions**: - - - `type: "Reconciled"`: Whether the resource's desired state has been - fully reconciled by all adapters at the current generation. - - - `type: "LastKnownReconciled"`: Sticky cross-generation condition — - stays True as long as all required adapters were reconciled at a - common observed generation, even if a newer generation is being - processed. - - - These conditions are present immediately upon resource creation. - items: - $ref: '#/definitions/ResourceCondition' - minItems: 2 - type: array - required: - - conditions - type: object - ObjectReference: - properties: - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - type: object - OrderDirection: - enum: - - asc - - desc - type: string - Resource: - example: - created_by: user-123@example.com - created_time: '2025-06-01T00:00:00Z' - generation: 1 - href: /api/hyperfleet/v1/resources/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: MyResource - labels: - environment: production - team: platform - name: my-resource-1 - spec: {} - status: - conditions: [] - updated_by: user-123@example.com - updated_time: '2025-06-01T10:02:00Z' - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - description: Incremented on spec or label changes - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI (computed at creation time) - type: string - id: - description: Resource identifier (UUID v7) - type: string - kind: - description: Entity type discriminator - type: string - labels: - additionalProperties: - type: string - description: Key-value pairs for filtering and grouping - type: object - name: - description: 'Resource name (unique per kind, or per kind+owner for child entities)' - maxLength: 253 - minLength: 1 - type: string - owner_references: - allOf: - - $ref: '#/definitions/ObjectReference' - description: Parent resource reference (present only on child entities) - references: - additionalProperties: - items: - $ref: '#/definitions/ObjectReference' - type: array - description: 'Non-ownership associations to other resources, keyed by reference type' - type: object - spec: - additionalProperties: {} - description: >- - Entity-specific payload, validated at runtime against the entity's - spec schema - type: object - status: - $ref: '#/definitions/ResourceStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - id - - kind - - name - - spec - - status - - generation - - created_time - - updated_time - - created_by - - updated_by - type: object - ResourceCondition: - description: >- - Condition in Cluster/NodePool status - - Used for semantic condition types: "ValidationSuccessful", - "DNSSuccessful", "NodePoolSuccessful", etc. - - Includes observed_generation and last_updated_time to track - adapter-specific state - properties: - created_time: - description: When this condition was first created (API-managed) - format: date-time - type: string - last_transition_time: - description: >- - When this condition last transitioned status (API-managed) - - Only updated when status changes (True/False), not when reason/message - changes - format: date-time - type: string - last_updated_time: - description: >- - When the corresponding adapter last reported (API-managed) - - Updated every time the adapter PUTs, even if condition status hasn't - changed - - Copied from AdapterStatus.last_report_time - format: date-time - type: string - message: - description: Human-readable message - type: string - observed_generation: - description: Generation of the spec that this condition reflects - format: int32 - type: integer - reason: - description: Machine-readable reason code - type: string - status: - $ref: '#/definitions/ResourceConditionStatus' - type: - description: Condition type - type: string - required: - - type - - last_transition_time - - status - - observed_generation - - created_time - - last_updated_time - type: object - ResourceConditionStatus: - description: Status value for resource conditions - enum: - - 'True' - - 'False' - type: string - ResourceCreateRequest: - example: - kind: MyResource - labels: - environment: production - team: platform - name: my-resource-1 - spec: {} - properties: - kind: - description: Entity type discriminator - type: string - labels: - additionalProperties: - type: string - description: Key-value pairs for filtering and grouping - type: object - name: - description: Resource name - maxLength: 253 - minLength: 1 - type: string - references: - additionalProperties: - items: - $ref: '#/definitions/ObjectReference' - type: array - description: Non-ownership associations to other resources - type: object - spec: - additionalProperties: {} - description: Entity-specific payload - type: object - required: - - kind - - name - - spec - type: object - ResourceList: - properties: - items: - items: - $ref: '#/definitions/Resource' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int64 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - ResourcePatchRequest: - additionalProperties: false - example: - labels: - env: staging - spec: {} - minProperties: 1 - properties: - labels: - additionalProperties: - type: string - type: object - references: - additionalProperties: - items: - $ref: '#/definitions/ObjectReference' - type: array - type: object - spec: - additionalProperties: {} - type: object - type: object - ResourceStatus: - description: |- - Aggregated status of the resource, populated by the status aggregation - pipeline from adapter condition reports. - properties: - conditions: - items: - $ref: '#/definitions/ResourceCondition' - type: array - required: - - conditions - type: object - ValidationError: - description: Field-level validation error detail - properties: - constraint: - description: The validation constraint that was violated - enum: - - required - - min - - max - - min_length - - max_length - - pattern - - enum - - format - - unique - example: required - type: string - field: - description: JSON path to the field that failed validation - example: spec.name - type: string - message: - description: Human-readable error message for this field - example: Cluster name is required - type: string - value: - description: The invalid value that was provided (if safe to include) - required: - - field - - message - type: object -securityDefinitions: - BearerAuth: - in: header - name: Authorization - type: apiKey -tags: - - name: Clusters - - name: Cluster statuses - - name: NodePool statuses - - name: Resource statuses - - name: Resources - - name: NodePools -x-components: - parameters: - QueryParams.order: - enum: - - asc - - desc - in: query - name: order - required: false - type: string - QueryParams.orderBy: - default: created_time - in: query - name: orderBy - required: false - type: string - QueryParams.page: - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - QueryParams.pageSize: - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - SearchParams: - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in ('c1','c2')`, - `labels.region='us-east'` - in: query - name: search - required: false - type: string - diff --git a/schemas/gcp/openapi.yaml b/schemas/gcp/openapi.yaml deleted file mode 100644 index 7e98065..0000000 --- a/schemas/gcp/openapi.yaml +++ /dev/null @@ -1,2710 +0,0 @@ -openapi: 3.0.0 -info: - title: HyperFleet API - version: 1.0.17 - contact: - name: HyperFleet Team - url: https://github.com/openshift-hyperfleet - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0 - description: |- - HyperFleet API provides simple CRUD operations for managing cluster resources and their status history. - - **Architecture**: Simple CRUD only, no business logic, no event creation. - Sentinel operator handles all orchestration logic. - Adapters handle the specifics of managing spec -tags: - - name: Clusters - - name: Channels - - name: Versions - - name: NodePools - - name: Resources -paths: - /api/hyperfleet/v1/channels: - get: - operationId: getChannels - summary: List channels - description: Returns a paginated list of channels, optionally filtered by labels or TSL query. - parameters: - - $ref: '#/components/parameters/SearchParams' - - $ref: '#/components/parameters/QueryParams.page' - - $ref: '#/components/parameters/QueryParams.pageSize' - - $ref: '#/components/parameters/QueryParams.orderBy' - - $ref: '#/components/parameters/QueryParams.order' - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/ChannelList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Channels - security: - - BearerAuth: [] - post: - operationId: postChannel - summary: Create channel - description: Creates a new channel. - parameters: [] - responses: - '201': - description: The request has succeeded and a new resource has been created as a result. - content: - application/json: - schema: - $ref: '#/components/schemas/Channel' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Channels - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ChannelCreateRequest' - security: - - BearerAuth: [] - /api/hyperfleet/v1/channels/{channel_id}: - get: - operationId: getChannelById - summary: Get channel by ID - description: Returns a single channel by its ID. - parameters: - - $ref: '#/components/parameters/SearchParams' - - name: channel_id - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Channel' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Channels - security: - - BearerAuth: [] - patch: - operationId: patchChannelById - summary: Patch channel by ID - description: Patches a channel by ID. Supports partial updates to spec and labels. - parameters: - - name: channel_id - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Channel' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Channels - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ChannelPatchRequest' - security: - - BearerAuth: [] - delete: - operationId: deleteChannelById - summary: Request channel deletion - description: Marks the channel for deletion. Returns 409 if versions still exist (RESTRICT policy). - parameters: - - name: channel_id - in: path - required: true - schema: - type: string - responses: - '202': - description: The request has been accepted for processing, but processing has not yet completed. - content: - application/json: - schema: - $ref: '#/components/schemas/Channel' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Channels - security: - - BearerAuth: [] - /api/hyperfleet/v1/channels/{channel_id}/versions: - get: - operationId: getVersionsByChannelId - summary: List versions for channel - description: Returns a paginated list of versions for a channel. - parameters: - - name: channel_id - in: path - required: true - schema: - type: string - - $ref: '#/components/parameters/SearchParams' - - $ref: '#/components/parameters/QueryParams.page' - - $ref: '#/components/parameters/QueryParams.pageSize' - - $ref: '#/components/parameters/QueryParams.orderBy' - - $ref: '#/components/parameters/QueryParams.order' - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/VersionList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Versions - security: - - BearerAuth: [] - post: - operationId: postVersion - summary: Create version - description: Creates a new version under a channel. - parameters: - - name: channel_id - in: path - required: true - schema: - type: string - responses: - '201': - description: The request has succeeded and a new resource has been created as a result. - content: - application/json: - schema: - $ref: '#/components/schemas/Version' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Versions - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreateRequest' - security: - - BearerAuth: [] - /api/hyperfleet/v1/channels/{channel_id}/versions/{version_id}: - get: - operationId: getVersionById - summary: Get version by ID - description: Returns a single version by its ID within a channel. - parameters: - - name: channel_id - in: path - required: true - schema: - type: string - - name: version_id - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Version' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Versions - security: - - BearerAuth: [] - patch: - operationId: patchVersionById - summary: Patch version by ID - description: Patch a version by ID. Supports partial updates to spec and labels. - parameters: - - name: channel_id - in: path - required: true - schema: - type: string - - name: version_id - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Version' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Versions - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/VersionPatchRequest' - security: - - BearerAuth: [] - delete: - operationId: deleteVersionById - summary: Request version deletion - description: Marks a version for deletion. - parameters: - - name: channel_id - in: path - required: true - schema: - type: string - - name: version_id - in: path - required: true - schema: - type: string - responses: - '202': - description: The request has been accepted for processing, but processing has not yet completed. - content: - application/json: - schema: - $ref: '#/components/schemas/Version' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Versions - security: - - BearerAuth: [] - /api/hyperfleet/v1/clusters: - get: - operationId: getClusters - summary: List clusters - description: Returns a list of all clusters. - parameters: - - $ref: '#/components/parameters/SearchParams' - - $ref: '#/components/parameters/QueryParams.page' - - $ref: '#/components/parameters/QueryParams.pageSize' - - $ref: '#/components/parameters/QueryParams.orderBy' - - $ref: '#/components/parameters/QueryParams.order' - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/ClusterList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Clusters - security: - - BearerAuth: [] - post: - operationId: postCluster - summary: Create cluster - description: |- - Create a new cluster resource. - - **Note**: The `status` object in the response is read-only and computed by the service. - It is NOT part of the request body. Initially, - status.conditions will include mandatory "LastKnownReconciled" and "Reconciled" conditions. - parameters: [] - responses: - '201': - description: The request has succeeded and a new resource has been created as a result. - content: - application/json: - schema: - $ref: '#/components/schemas/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Clusters - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ClusterCreateRequest' - security: - - BearerAuth: [] - /api/hyperfleet/v1/clusters/{cluster_id}: - get: - operationId: getClusterById - summary: Get cluster by ID - description: Returns a single cluster by its ID. - parameters: - - $ref: '#/components/parameters/SearchParams' - - name: cluster_id - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Clusters - security: - - BearerAuth: [] - patch: - operationId: patchClusterById - summary: Patch cluster by ID - description: Patch a specific cluster by ID - parameters: - - name: cluster_id - in: path - required: true - description: Cluster ID - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Clusters - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ClusterPatchRequest' - security: - - BearerAuth: [] - delete: - operationId: deleteClusterById - summary: Request cluster deletion - description: |- - Marks the cluster for deletion by setting deleted_time to the current time, cascades to its nodepools. - The cluster remains in the database until it is fully deleted. - Returns the updated cluster with generation incremented. - parameters: - - name: cluster_id - in: path - required: true - schema: - type: string - responses: - '202': - description: The request has been accepted for processing, but processing has not yet completed. - content: - application/json: - schema: - $ref: '#/components/schemas/Cluster' - example: - kind: Cluster - id: 019466a0-8f8e-7abc-9def-0123456789ab - href: https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - name: cluster-123 - labels: - environment: production - team: platform - spec: - platform: - type: gcp - gcp: - projectID: project-123 - region: us-central1 - zone: us-central1-a - network: network-123 - subnet: subnet-123 - release: - image: registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4 - version: 4.22.0-ec.4 - channelGroup: candidate - networking: - clusterNetwork: - - cidr: 10.10.0.0/16 - hostPrefix: 24 - serviceNetwork: - - 10.96.0.0/12 - dns: - baseDomain: example.com - generation: 2 - status: - conditions: - - type: Reconciled - status: 'True' - reason: ReconciledAll - message: All required adapters reported Available=True or Finalized=True at the current generation - observed_generation: 2 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: LastKnownReconciled - status: 'True' - reason: AllAdaptersReconciled - message: All required adapters report Available=True for the tracked generation - observed_generation: 2 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: Adapter1Successful - status: 'True' - reason: This adapter1 is available - message: This adapter1 is available - observed_generation: 2 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: Adapter2Successful - status: 'True' - reason: This adapter2 is available - message: This adapter2 is available - observed_generation: 2 - created_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - created_time: '2021-01-01T00:00:00Z' - updated_time: '2021-01-01T10:02:00Z' - deleted_time: '2021-01-01T10:05:00Z' - created_by: user-123@example.com - updated_by: user-123@example.com - deleted_by: user-123@example.com - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Clusters - security: - - BearerAuth: [] - /api/hyperfleet/v1/clusters/{cluster_id}/nodepools: - get: - operationId: getNodePoolsByClusterId - summary: List all nodepools for cluster - description: Returns the list of all nodepools for a cluster - parameters: - - name: cluster_id - in: path - required: true - description: Cluster ID - schema: - type: string - - $ref: '#/components/parameters/SearchParams' - - $ref: '#/components/parameters/QueryParams.page' - - $ref: '#/components/parameters/QueryParams.pageSize' - - $ref: '#/components/parameters/QueryParams.orderBy' - - $ref: '#/components/parameters/QueryParams.order' - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/NodePoolList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - NodePools - security: - - BearerAuth: [] - post: - operationId: createNodePool - summary: Create nodepool - description: Create a NodePool for a cluster - parameters: - - name: cluster_id - in: path - required: true - description: Cluster ID - schema: - type: string - responses: - '201': - description: The request has succeeded and a new resource has been created as a result. - content: - application/json: - schema: - $ref: '#/components/schemas/NodePoolCreateResponse' - '400': - description: The server could not understand the request due to invalid syntax. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - NodePools - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/NodePoolCreateRequest' - security: - - BearerAuth: [] - /api/hyperfleet/v1/clusters/{cluster_id}/nodepools/{nodepool_id}: - get: - operationId: getNodePoolById - summary: Get nodepool by ID - description: Returns specific nodepool - parameters: - - name: cluster_id - in: path - required: true - description: Cluster ID - schema: - type: string - - name: nodepool_id - in: path - required: true - description: NodePool ID - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/NodePool' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - NodePools - security: - - BearerAuth: [] - delete: - operationId: deleteNodePoolById - summary: Request nodepool deletion - description: |- - Marks the nodepool for deletion by setting deleted_time and deleted_by. Does not affect the parent cluster. - Returns the updated nodepool with generation incremented. - parameters: - - name: cluster_id - in: path - required: true - description: Cluster ID - schema: - type: string - - name: nodepool_id - in: path - required: true - description: NodePool ID - schema: - type: string - responses: - '202': - description: The request has been accepted for processing, but processing has not yet completed. - content: - application/json: - schema: - $ref: '#/components/schemas/NodePool' - example: - kind: NodePool - id: 019466a1-2b3c-7def-8abc-456789abcdef - href: https://api.hyperfleet.com/v1/nodepools/019466a1-2b3c-7def-8abc-456789abcdef - name: worker-pool-1 - labels: - environment: production - pooltype: worker - generation: 2 - spec: - platform: - type: gcp - gcp: - machineType: n1-standard-4 - diskSize: 100 - diskType: pd-standard - zones: - - us-central1-a - - us-central1-b - preemptible: false - labels: - team: platform - managedby: hyperfleet - nodeCount: 3 - autoscaling: - enabled: true - minNodes: 1 - maxNodes: 10 - targetCPUUtilization: 80 - owner_references: - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - href: https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - status: - conditions: - - type: Reconciled - status: 'True' - reason: ReconciledAll - message: All required adapters reported Available=True or Finalized=True at the current generation - observed_generation: 2 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: LastKnownReconciled - status: 'True' - reason: AllAdaptersReconciled - message: All required adapters report Available=True for the tracked generation - observed_generation: 2 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: ValidationSuccessful - status: 'True' - reason: All validations passed - message: NodePool validation passed - observed_generation: 2 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: NodePoolSuccessful - status: 'True' - reason: NodePool provisioned successfully - message: NodePool has 3 nodes running - observed_generation: 2 - created_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - created_time: '2021-01-01T00:00:00Z' - updated_time: '2021-01-01T10:02:00Z' - deleted_time: '2021-01-01T10:05:00Z' - created_by: user-123@example.com - updated_by: user-123@example.com - deleted_by: user-123@example.com - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - NodePools - security: - - BearerAuth: [] - patch: - operationId: patchNodePoolById - summary: Patch nodepool by ID - description: Patch a specific nodepool within a cluster - parameters: - - name: cluster_id - in: path - required: true - description: Cluster ID - schema: - type: string - - name: nodepool_id - in: path - required: true - description: NodePool ID - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/NodePool' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - NodePools - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/NodePoolPatchRequest' - security: - - BearerAuth: [] - /api/hyperfleet/v1/nodepools: - get: - operationId: getNodePools - summary: List all nodepools for cluster - description: Returns the list of all nodepools - parameters: - - $ref: '#/components/parameters/SearchParams' - - $ref: '#/components/parameters/QueryParams.page' - - $ref: '#/components/parameters/QueryParams.pageSize' - - $ref: '#/components/parameters/QueryParams.orderBy' - - $ref: '#/components/parameters/QueryParams.order' - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/NodePoolList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - NodePools - security: - - BearerAuth: [] - /api/hyperfleet/v1/resources: - get: - operationId: getResources - summary: List resources - description: Returns a paginated list of all resources, optionally filtered by kind, labels, or TSL query. - parameters: - - $ref: '#/components/parameters/SearchParams' - - $ref: '#/components/parameters/QueryParams.page' - - $ref: '#/components/parameters/QueryParams.pageSize' - - $ref: '#/components/parameters/QueryParams.orderBy' - - $ref: '#/components/parameters/QueryParams.order' - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/ResourceList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Resources - security: - - BearerAuth: [] - post: - operationId: postResource - summary: Create resource - description: |- - Create a new resource. Only top-level entity types (no parent) can be created - via this endpoint. Child entities must use the nested route under their parent. - parameters: [] - responses: - '201': - description: The request has succeeded and a new resource has been created as a result. - content: - application/json: - schema: - $ref: '#/components/schemas/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Resources - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ResourceCreateRequest' - security: - - BearerAuth: [] - /api/hyperfleet/v1/resources/{resource_id}: - get: - operationId: getResourceById - summary: Get resource by ID - description: Returns a single resource by its ID. - parameters: - - $ref: '#/components/parameters/SearchParams' - - name: resource_id - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Resources - security: - - BearerAuth: [] - patch: - operationId: patchResourceById - summary: Patch resource by ID - description: Patch a resource by ID. Supports partial updates to spec, labels, and references. - parameters: - - name: resource_id - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Resources - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ResourcePatchRequest' - security: - - BearerAuth: [] - delete: - operationId: deleteResourceById - summary: Request resource deletion - description: |- - Marks the resource for deletion. Child resources are handled per their - OnParentDelete policy (cascade or restrict). Returns 409 if a restrict-policy - child exists or if another resource holds a reference to this one. - parameters: - - name: resource_id - in: path - required: true - schema: - type: string - responses: - '202': - description: The request has been accepted for processing, but processing has not yet completed. - content: - application/json: - schema: - $ref: '#/components/schemas/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - content: - application/problem+json: - schema: - $ref: '#/components/schemas/Error' - tags: - - Resources - security: - - BearerAuth: [] -components: - parameters: - QueryParams.order: - name: order - in: query - required: false - schema: - $ref: '#/components/schemas/OrderDirection' - explode: false - QueryParams.orderBy: - name: orderBy - in: query - required: false - schema: - type: string - default: created_time - explode: false - QueryParams.page: - name: page - in: query - required: false - schema: - type: integer - format: int32 - default: 1 - explode: false - QueryParams.pageSize: - name: pageSize - in: query - required: false - schema: - type: integer - format: int32 - default: 20 - explode: false - SearchParams: - name: search - in: query - required: false - description: |- - Filter results using TSL (Tree Search Language) query syntax. - Examples: `status.conditions.Reconciled='True'`, `name in ('c1','c2')`, `labels.region='us-east'` - schema: - type: string - explode: false - schemas: - AcceleratorSpec: - type: object - required: - - type - - count - properties: - type: - type: string - count: - type: integer - minimum: 1 - AutoscalingSpec: - type: object - properties: - enabled: - type: boolean - minNodes: - type: integer - minimum: 0 - maxNodes: - type: integer - minimum: 1 - targetCPUUtilization: - type: integer - minimum: 1 - maximum: 100 - targetMemoryUtilization: - type: integer - minimum: 1 - maximum: 100 - scaleDownDelay: - type: string - scaleUpDelay: - type: string - BearerAuth: - type: object - required: - - type - - scheme - properties: - type: - type: string - enum: - - http - scheme: - type: string - enum: - - bearer - Channel: - type: object - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - status - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 1 - maxLength: 63 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - spec: - $ref: '#/components/schemas/ChannelSpec' - created_time: - type: string - format: date-time - description: Timestamp when the resource was created - updated_time: - type: string - format: date-time - description: Timestamp when the resource was last updated - created_by: - type: string - format: email - description: Identity that created the resource - updated_by: - type: string - format: email - description: Identity that last updated the resource - deleted_time: - type: string - format: date-time - description: Timestamp when deletion was requested; omitted if not marked for deletion - deleted_by: - type: string - format: email - description: Identity that requested deletion; omitted if not marked for deletion - generation: - type: integer - format: int32 - minimum: 1 - status: - $ref: '#/components/schemas/ResourceStatus' - example: - kind: Channel - id: 019466a2-1234-7abc-9def-0123456789ab - href: /api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab - name: stable - labels: - tier: production - spec: - is_default: true - enabled_regex: ^4\.\d+\.\d+$ - generation: 1 - status: - conditions: [] - created_time: '2025-06-01T00:00:00Z' - updated_time: '2025-06-01T10:02:00Z' - created_by: user-123@example.com - updated_by: user-123@example.com - ChannelCreateRequest: - type: object - required: - - name - - spec - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 1 - maxLength: 63 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - spec: - $ref: '#/components/schemas/ChannelSpec' - example: - kind: Channel - name: stable - labels: - tier: production - spec: - is_default: true - enabled_regex: ^4\.\d+\.\d+$ - ChannelList: - type: object - required: - - kind - - page - - size - - total - - items - properties: - kind: - type: string - page: - type: integer - format: int32 - size: - type: integer - format: int32 - total: - type: integer - format: int32 - items: - type: array - items: - $ref: '#/components/schemas/Channel' - ChannelPatchRequest: - type: object - properties: - spec: - $ref: '#/components/schemas/ChannelSpecUpdate' - labels: - type: object - additionalProperties: - type: string - example: - spec: - is_default: false - enabled_regex: ^4\.17\.\d+$ - labels: - tier: staging - additionalProperties: false - minProperties: 1 - ChannelSpec: - type: object - required: - - is_default - - enabled_regex - properties: - is_default: - type: boolean - description: Whether this is the default channel for new clusters - enabled_regex: - type: string - description: Regex pattern for matching enabled version strings - ChannelSpecUpdate: - type: object - properties: - is_default: - type: boolean - description: Whether this is the default channel for new clusters - enabled_regex: - type: string - description: Regex pattern for matching enabled version strings - Cluster: - type: object - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - status - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 3 - maxLength: 53 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - description: Cluster name (unique) - spec: - $ref: '#/components/schemas/ClusterSpec' - created_time: - type: string - format: date-time - description: Timestamp when the resource was created - updated_time: - type: string - format: date-time - description: Timestamp when the resource was last updated - created_by: - type: string - format: email - description: Identity that created the resource - updated_by: - type: string - format: email - description: Identity that last updated the resource - deleted_time: - type: string - format: date-time - description: Timestamp when deletion was requested; omitted if not marked for deletion - deleted_by: - type: string - format: email - description: Identity that requested deletion; omitted if not marked for deletion - generation: - type: integer - format: int32 - minimum: 1 - description: Generation field is updated on customer updates, reflecting the version of the "intent" of the customer - status: - $ref: '#/components/schemas/ClusterStatus' - example: - kind: Cluster - id: 019466a0-8f8e-7abc-9def-0123456789ab - href: https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - name: cluster-123 - labels: - environment: production - team: platform - spec: - platform: - type: gcp - gcp: - projectID: project-123 - region: us-central1 - zone: us-central1-a - network: network-123 - subnet: subnet-123 - release: - image: registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4 - version: 4.22.0-ec.4 - channelGroup: candidate - networking: - clusterNetwork: - - cidr: 10.10.0.0/16 - hostPrefix: 24 - serviceNetwork: - - 10.96.0.0/12 - dns: - baseDomain: example.com - generation: 1 - status: - conditions: - - type: Reconciled - status: 'True' - reason: ReconciledAll - message: All required adapters reported Available=True or Finalized=True at the current generation - observed_generation: 1 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: LastKnownReconciled - status: 'True' - reason: AllAdaptersReconciled - message: All required adapters report Available=True for the tracked generation - observed_generation: 1 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: Adapter1Successful - status: 'True' - reason: This adapter1 is available - message: This adapter1 is available - observed_generation: 1 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: Adapter2Successful - status: 'True' - reason: This adapter2 is available - message: This adapter2 is available - observed_generation: 1 - created_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - created_time: '2021-01-01T00:00:00Z' - updated_time: '2021-01-01T10:02:00Z' - created_by: user-123@example.com - updated_by: user-123@example.com - ClusterCreateRequest: - type: object - required: - - name - - spec - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 3 - maxLength: 53 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - description: Cluster name (unique) - spec: - $ref: '#/components/schemas/ClusterSpec' - example: - kind: Cluster - name: cluster-123 - labels: - environment: production - team: platform - spec: - platform: - type: gcp - gcp: - projectID: project-123 - region: us-central1 - zone: us-central1-a - network: network-123 - subnet: subnet-123 - release: - image: registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4 - version: 4.22.0-ec.4 - channelGroup: candidate - networking: - clusterNetwork: - - cidr: 10.10.0.0/16 - hostPrefix: 24 - serviceNetwork: - - 10.96.0.0/12 - dns: - baseDomain: example.com - ClusterList: - type: object - required: - - kind - - page - - size - - total - - items - properties: - kind: - type: string - page: - type: integer - format: int32 - size: - type: integer - format: int32 - total: - type: integer - format: int32 - items: - type: array - items: - $ref: '#/components/schemas/Cluster' - ClusterNetworkEntry: - type: object - properties: - cidr: - type: string - hostPrefix: - type: integer - ClusterPatchRequest: - type: object - properties: - spec: - $ref: '#/components/schemas/ClusterSpecUpdate' - labels: - type: object - additionalProperties: - type: string - example: - spec: - platform: - type: gcp - gcp: - projectID: project-123 - region: us-central1 - zone: us-central1-a - network: network-123 - subnet: subnet-123 - release: - image: registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4 - version: 4.22.0-ec.4 - channelGroup: candidate - networking: - clusterNetwork: - - cidr: 10.10.0.0/16 - hostPrefix: 24 - serviceNetwork: - - 10.96.0.0/12 - dns: - baseDomain: example.com - labels: - env: staging - additionalProperties: false - minProperties: 1 - ClusterPlatform: - type: object - properties: - projectID: - type: string - region: - type: string - zone: - type: string - network: - type: string - subnet: - type: string - ClusterPlatformSpec: - type: object - required: - - type - - gcp - properties: - type: - type: string - enum: - - gcp - gcp: - $ref: '#/components/schemas/ClusterPlatform' - ClusterPlatformSpecUpdate: - type: object - properties: - type: - type: string - enum: - - gcp - gcp: - $ref: '#/components/schemas/ClusterPlatform' - ClusterSpec: - type: object - required: - - platform - properties: - infraID: - type: string - platform: - $ref: '#/components/schemas/ClusterPlatformSpec' - release: - $ref: '#/components/schemas/ReleaseSpec' - networking: - $ref: '#/components/schemas/NetworkingSpec' - dns: - $ref: '#/components/schemas/DNSSpec' - ClusterSpecUpdate: - type: object - properties: - infraID: - type: string - platform: - $ref: '#/components/schemas/ClusterPlatformSpecUpdate' - release: - $ref: '#/components/schemas/ReleaseSpec' - networking: - $ref: '#/components/schemas/NetworkingSpec' - dns: - $ref: '#/components/schemas/DNSSpec' - ClusterStatus: - type: object - required: - - conditions - properties: - conditions: - type: array - items: - $ref: '#/components/schemas/ResourceCondition' - minItems: 2 - description: |- - List of status conditions for the cluster. - - **Mandatory conditions**: - - `type: "Reconciled"`: Whether the resource's desired state has been fully reconciled by all adapters at the current generation. - - `type: "LastKnownReconciled"`: Sticky cross-generation condition — stays True as long as all required adapters were reconciled at a common observed generation, even if a newer generation is being processed. - - These conditions are present immediately upon resource creation. - description: |- - Cluster status computed from all status conditions. - - This object is computed by the service and CANNOT be modified directly. - It is aggregated from condition updates posted to `/clusters/{id}/statuses`. - - Provides quick overview of all reported conditions. - DNSSpec: - type: object - properties: - baseDomain: - type: string - Error: - type: object - required: - - type - - title - - status - properties: - type: - type: string - format: uri - description: URI reference identifying the problem type - example: https://api.hyperfleet.io/errors/validation-error - title: - type: string - description: Short human-readable summary of the problem - example: Validation Failed - status: - type: integer - description: HTTP status code - example: 400 - detail: - type: string - description: Human-readable explanation specific to this occurrence - example: The cluster name field is required - instance: - type: string - format: uri-reference - description: URI reference for this specific occurrence - example: /api/hyperfleet/v1/clusters - code: - type: string - description: Machine-readable error code in HYPERFLEET-CAT-NUM format - example: HYPERFLEET-VAL-001 - timestamp: - type: string - format: date-time - description: RFC3339 timestamp of when the error occurred - example: '2024-01-15T10:30:00Z' - trace_id: - type: string - description: Distributed trace ID for correlation - example: abc123def456 - errors: - type: array - items: - $ref: '#/components/schemas/ValidationError' - description: Field-level validation errors (for validation failures) - description: RFC 9457 Problem Details error format with HyperFleet extensions - NetworkingSpec: - type: object - properties: - clusterNetwork: - type: array - items: - $ref: '#/components/schemas/ClusterNetworkEntry' - serviceNetwork: - type: array - items: - type: string - NodePool: - type: object - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - owner_references - - status - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 3 - maxLength: 15 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - description: NodePool name (unique in a cluster) - spec: - $ref: '#/components/schemas/NodePoolSpec' - created_time: - type: string - format: date-time - description: Timestamp when the resource was created - updated_time: - type: string - format: date-time - description: Timestamp when the resource was last updated - created_by: - type: string - format: email - description: Identity that created the resource - updated_by: - type: string - format: email - description: Identity that last updated the resource - deleted_time: - type: string - format: date-time - description: Timestamp when deletion was requested; omitted if not marked for deletion - deleted_by: - type: string - format: email - description: Identity that requested deletion; omitted if not marked for deletion - generation: - type: integer - format: int32 - minimum: 1 - description: Generation field is updated on customer updates, reflecting the version of the "intent" of the customer - owner_references: - $ref: '#/components/schemas/ObjectReference' - status: - $ref: '#/components/schemas/NodePoolStatus' - example: - kind: NodePool - id: 019466a1-2b3c-7def-8abc-456789abcdef - href: https://api.hyperfleet.com/v1/nodepools/019466a1-2b3c-7def-8abc-456789abcdef - name: worker-pool-1 - labels: - environment: production - pooltype: worker - generation: 1 - spec: - platform: - type: gcp - gcp: - machineType: n1-standard-4 - diskSize: 100 - diskType: pd-standard - zones: - - us-central1-a - - us-central1-b - preemptible: false - labels: - team: platform - managedby: hyperfleet - nodeCount: 3 - autoscaling: - enabled: true - minNodes: 1 - maxNodes: 10 - targetCPUUtilization: 80 - owner_references: - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - href: https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - status: - conditions: - - type: Reconciled - status: 'True' - reason: ReconciledAll - message: All required adapters reported Available=True or Finalized=True at the current generation - observed_generation: 1 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: LastKnownReconciled - status: 'True' - reason: AllAdaptersReconciled - message: All required adapters report Available=True for the tracked generation - observed_generation: 1 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: ValidationSuccessful - status: 'True' - reason: All validations passed - message: NodePool validation passed - observed_generation: 1 - created_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - - type: NodePoolSuccessful - status: 'True' - reason: NodePool provisioned successfully - message: NodePool has 3 nodes running - observed_generation: 1 - created_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - created_time: '2021-01-01T00:00:00Z' - updated_time: '2021-01-01T10:02:00Z' - created_by: user-123@example.com - updated_by: user-123@example.com - NodePoolCreateRequest: - type: object - required: - - name - - spec - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 3 - maxLength: 15 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - description: NodePool name (unique in a cluster) - spec: - $ref: '#/components/schemas/NodePoolSpec' - example: - name: worker-pool-1 - labels: - environment: production - pooltype: worker - spec: - platform: - type: gcp - gcp: - machineType: n1-standard-4 - diskSize: 100 - diskType: pd-standard - zones: - - us-central1-a - - us-central1-b - preemptible: false - labels: - team: platform - managedby: hyperfleet - nodeCount: 3 - autoscaling: - enabled: true - minNodes: 1 - maxNodes: 10 - targetCPUUtilization: 80 - NodePoolCreateResponse: - type: object - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - owner_references - - status - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 3 - maxLength: 15 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - description: NodePool name (unique in a cluster) - spec: - $ref: '#/components/schemas/NodePoolSpec' - created_time: - type: string - format: date-time - description: Timestamp when the resource was created - updated_time: - type: string - format: date-time - description: Timestamp when the resource was last updated - created_by: - type: string - format: email - description: Identity that created the resource - updated_by: - type: string - format: email - description: Identity that last updated the resource - deleted_time: - type: string - format: date-time - description: Timestamp when deletion was requested; omitted if not marked for deletion - deleted_by: - type: string - format: email - description: Identity that requested deletion; omitted if not marked for deletion - generation: - type: integer - format: int32 - minimum: 1 - description: Generation field is updated on customer updates, reflecting the version of the "intent" of the customer - owner_references: - $ref: '#/components/schemas/ObjectReference' - status: - $ref: '#/components/schemas/NodePoolStatus' - NodePoolList: - type: object - required: - - kind - - page - - size - - total - - items - properties: - kind: - type: string - page: - type: integer - format: int32 - size: - type: integer - format: int32 - total: - type: integer - format: int32 - items: - type: array - items: - $ref: '#/components/schemas/NodePool' - NodePoolPatchRequest: - type: object - properties: - spec: - $ref: '#/components/schemas/NodePoolSpecUpdate' - labels: - type: object - additionalProperties: - type: string - example: - spec: - platform: - type: gcp - gcp: - machineType: n1-standard-4 - diskSize: 100 - diskType: pd-standard - zones: - - us-central1-a - - us-central1-b - preemptible: false - labels: - team: platform - managedby: hyperfleet - nodeCount: 3 - autoscaling: - enabled: true - minNodes: 1 - maxNodes: 10 - targetCPUUtilization: 80 - labels: - env: staging - additionalProperties: false - minProperties: 1 - NodePoolPlatform: - type: object - properties: - machineType: - type: string - diskSize: - type: integer - minimum: 10 - diskType: - type: string - enum: - - pd-standard - - pd-ssd - - pd-balanced - zones: - type: array - items: - type: string - preemptible: - type: boolean - accelerators: - type: array - items: - $ref: '#/components/schemas/AcceleratorSpec' - labels: - type: object - additionalProperties: - type: string - taints: - type: array - items: - $ref: '#/components/schemas/TaintSpec' - NodePoolPlatformSpec: - type: object - required: - - type - - gcp - properties: - type: - type: string - enum: - - gcp - gcp: - $ref: '#/components/schemas/NodePoolPlatform' - NodePoolPlatformSpecUpdate: - type: object - properties: - type: - type: string - enum: - - gcp - gcp: - $ref: '#/components/schemas/NodePoolPlatform' - NodePoolSpec: - type: object - required: - - platform - properties: - platform: - $ref: '#/components/schemas/NodePoolPlatformSpec' - nodeCount: - type: integer - minimum: 0 - autoscaling: - $ref: '#/components/schemas/AutoscalingSpec' - NodePoolSpecUpdate: - type: object - properties: - platform: - $ref: '#/components/schemas/NodePoolPlatformSpecUpdate' - nodeCount: - type: integer - minimum: 0 - autoscaling: - $ref: '#/components/schemas/AutoscalingSpec' - NodePoolStatus: - type: object - required: - - conditions - properties: - conditions: - type: array - items: - $ref: '#/components/schemas/ResourceCondition' - minItems: 2 - description: |- - List of status conditions for the nodepool. - - **Mandatory conditions**: - - `type: "Reconciled"`: Whether the resource's desired state has been fully reconciled by all adapters at the current generation. - - `type: "LastKnownReconciled"`: Sticky cross-generation condition — stays True as long as all required adapters were reconciled at a common observed generation, even if a newer generation is being processed. - - These conditions are present immediately upon resource creation. - description: |- - NodePool status computed from all status conditions. - - This object is computed by the service and CANNOT be modified directly. - ObjectReference: - type: object - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - OrderDirection: - type: string - enum: - - asc - - desc - ReleaseSpec: - type: object - properties: - image: - type: string - version: - type: string - channelGroup: - type: string - Resource: - type: object - required: - - id - - kind - - name - - spec - - status - - generation - - created_time - - updated_time - - created_by - - updated_by - properties: - id: - type: string - description: Resource identifier (UUID v7) - kind: - type: string - description: Entity type discriminator - name: - type: string - minLength: 1 - maxLength: 253 - description: Resource name (unique per kind, or per kind+owner for child entities) - href: - type: string - description: Resource URI (computed at creation time) - spec: - type: object - additionalProperties: {} - description: Entity-specific payload, validated at runtime against the entity's spec schema - labels: - type: object - additionalProperties: - type: string - description: Key-value pairs for filtering and grouping - status: - $ref: '#/components/schemas/ResourceStatus' - generation: - type: integer - format: int32 - minimum: 1 - description: Incremented on spec or label changes - owner_references: - allOf: - - $ref: '#/components/schemas/ObjectReference' - description: Parent resource reference (present only on child entities) - references: - type: object - additionalProperties: - type: array - items: - $ref: '#/components/schemas/ObjectReference' - description: Non-ownership associations to other resources, keyed by reference type - created_time: - type: string - format: date-time - description: Timestamp when the resource was created - updated_time: - type: string - format: date-time - description: Timestamp when the resource was last updated - created_by: - type: string - format: email - description: Identity that created the resource - updated_by: - type: string - format: email - description: Identity that last updated the resource - deleted_time: - type: string - format: date-time - description: Timestamp when deletion was requested; omitted if not marked for deletion - deleted_by: - type: string - format: email - description: Identity that requested deletion; omitted if not marked for deletion - example: - kind: MyResource - id: 019466a0-8f8e-7abc-9def-0123456789ab - href: /api/hyperfleet/v1/resources/019466a0-8f8e-7abc-9def-0123456789ab - name: my-resource-1 - labels: - environment: production - team: platform - spec: {} - generation: 1 - status: - conditions: [] - created_time: '2025-06-01T00:00:00Z' - updated_time: '2025-06-01T10:02:00Z' - created_by: user-123@example.com - updated_by: user-123@example.com - ResourceCondition: - type: object - required: - - type - - last_transition_time - - status - - observed_generation - - created_time - - last_updated_time - properties: - type: - type: string - description: Condition type - reason: - type: string - description: Machine-readable reason code - message: - type: string - description: Human-readable message - last_transition_time: - type: string - format: date-time - description: |- - When this condition last transitioned status (API-managed) - Only updated when status changes (True/False), not when reason/message changes - status: - $ref: '#/components/schemas/ResourceConditionStatus' - observed_generation: - type: integer - format: int32 - description: Generation of the spec that this condition reflects - created_time: - type: string - format: date-time - description: When this condition was first created (API-managed) - last_updated_time: - type: string - format: date-time - description: |- - When the corresponding adapter last reported (API-managed) - Updated every time the adapter PUTs, even if condition status hasn't changed - Copied from AdapterStatus.last_report_time - description: |- - Condition in Cluster/NodePool status - Used for semantic condition types: "ValidationSuccessful", "DNSSuccessful", "NodePoolSuccessful", etc. - Includes observed_generation and last_updated_time to track adapter-specific state - ResourceConditionStatus: - type: string - enum: - - 'True' - - 'False' - description: Status value for resource conditions - ResourceCreateRequest: - type: object - required: - - kind - - name - - spec - properties: - kind: - type: string - description: Entity type discriminator - name: - type: string - minLength: 1 - maxLength: 253 - description: Resource name - spec: - type: object - additionalProperties: {} - description: Entity-specific payload - labels: - type: object - additionalProperties: - type: string - description: Key-value pairs for filtering and grouping - references: - type: object - additionalProperties: - type: array - items: - $ref: '#/components/schemas/ObjectReference' - description: Non-ownership associations to other resources - example: - kind: MyResource - name: my-resource-1 - spec: {} - labels: - environment: production - team: platform - ResourceList: - type: object - required: - - kind - - page - - size - - total - - items - properties: - kind: - type: string - page: - type: integer - format: int32 - size: - type: integer - format: int32 - total: - type: integer - format: int64 - items: - type: array - items: - $ref: '#/components/schemas/Resource' - ResourcePatchRequest: - type: object - properties: - spec: - type: object - additionalProperties: {} - labels: - type: object - additionalProperties: - type: string - references: - type: object - additionalProperties: - type: array - items: - $ref: '#/components/schemas/ObjectReference' - example: - spec: {} - labels: - env: staging - additionalProperties: false - minProperties: 1 - ResourceStatus: - type: object - required: - - conditions - properties: - conditions: - type: array - items: - $ref: '#/components/schemas/ResourceCondition' - description: |- - Aggregated status of the resource, populated by the status aggregation - pipeline from adapter condition reports. - TaintSpec: - type: object - required: - - key - - effect - properties: - key: - type: string - value: - type: string - effect: - type: string - enum: - - NoSchedule - - PreferNoSchedule - - NoExecute - ValidationError: - type: object - required: - - field - - message - properties: - field: - type: string - description: JSON path to the field that failed validation - example: spec.name - value: - description: The invalid value that was provided (if safe to include) - constraint: - type: string - enum: - - required - - min - - max - - min_length - - max_length - - pattern - - enum - - format - - unique - description: The validation constraint that was violated - example: required - message: - type: string - description: Human-readable error message for this field - example: Cluster name is required - description: Field-level validation error detail - Version: - type: object - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - owner_references - - status - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 1 - maxLength: 63 - spec: - $ref: '#/components/schemas/VersionSpec' - created_time: - type: string - format: date-time - description: Timestamp when the resource was created - updated_time: - type: string - format: date-time - description: Timestamp when the resource was last updated - created_by: - type: string - format: email - description: Identity that created the resource - updated_by: - type: string - format: email - description: Identity that last updated the resource - deleted_time: - type: string - format: date-time - description: Timestamp when deletion was requested; omitted if not marked for deletion - deleted_by: - type: string - format: email - description: Identity that requested deletion; omitted if not marked for deletion - generation: - type: integer - format: int32 - minimum: 1 - owner_references: - $ref: '#/components/schemas/ObjectReference' - status: - $ref: '#/components/schemas/ResourceStatus' - example: - kind: Version - id: 019466a3-5678-7abc-9def-0123456789ab - href: /api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab/versions/019466a3-5678-7abc-9def-0123456789ab - name: 4.17.12 - labels: {} - spec: - raw_version: 4.17.12 - enabled: true - is_default: true - release_image: quay.io/openshift-release-dev/ocp-release:4.17.12-multi - generation: 1 - owner_references: - id: 019466a2-1234-7abc-9def-0123456789ab - kind: Channel - href: /api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab - status: - conditions: [] - created_time: '2025-06-01T00:00:00Z' - updated_time: '2025-06-01T10:02:00Z' - created_by: user-123@example.com - updated_by: user-123@example.com - VersionCreateRequest: - type: object - required: - - name - - spec - properties: - id: - type: string - description: Resource identifier - kind: - type: string - description: Resource kind - href: - type: string - description: Resource URI - labels: - type: object - additionalProperties: - type: string - description: labels for the API resource as pairs of name:value strings - name: - type: string - minLength: 1 - maxLength: 63 - spec: - $ref: '#/components/schemas/VersionSpec' - example: - kind: Version - name: 4.17.12 - labels: {} - spec: - raw_version: 4.17.12 - enabled: true - is_default: true - release_image: quay.io/openshift-release-dev/ocp-release:4.17.12-multi - VersionList: - type: object - required: - - kind - - page - - size - - total - - items - properties: - kind: - type: string - page: - type: integer - format: int32 - size: - type: integer - format: int32 - total: - type: integer - format: int32 - items: - type: array - items: - $ref: '#/components/schemas/Version' - VersionPatchRequest: - type: object - properties: - spec: - $ref: '#/components/schemas/VersionSpecUpdate' - labels: - type: object - additionalProperties: - type: string - example: - spec: - raw_version: 4.17.12 - enabled: false - is_default: false - release_image: quay.io/openshift-release-dev/ocp-release:4.17.12-multi - labels: - deprecated: 'true' - additionalProperties: false - minProperties: 1 - VersionSpec: - type: object - required: - - raw_version - - enabled - - is_default - - release_image - properties: - raw_version: - type: string - description: Raw version string (e.g., "4.17.12") - enabled: - type: boolean - description: Whether this version is enabled for provisioning - is_default: - type: boolean - description: Whether this is the default version for its channel - release_image: - type: string - description: Container image reference for the release - end_of_life_time: - type: string - format: date-time - description: When this version reaches end of life - VersionSpecUpdate: - type: object - properties: - raw_version: - type: string - description: Raw version string (e.g., "4.17.12") - enabled: - type: boolean - description: Whether this version is enabled for provisioning - is_default: - type: boolean - description: Whether this is the default version for its channel - release_image: - type: string - description: Container image reference for the release - end_of_life_time: - type: string - format: date-time - description: When this version reaches end of life - securitySchemes: - BearerAuth: - type: http - scheme: bearer -servers: - - url: https://hyperfleet.redhat.com - description: Production - variables: {} diff --git a/schemas/gcp/swagger.yaml b/schemas/gcp/swagger.yaml deleted file mode 100644 index f96773d..0000000 --- a/schemas/gcp/swagger.yaml +++ /dev/null @@ -1,2984 +0,0 @@ -swagger: '2.0' -info: - contact: - name: HyperFleet Team - url: 'https://github.com/openshift-hyperfleet' - description: >- - HyperFleet API provides simple CRUD operations for managing cluster - resources and their status history. - - - **Architecture**: Simple CRUD only, no business logic, no event creation. - - Sentinel operator handles all orchestration logic. - - Adapters handle the specifics of managing spec - license: - name: Apache 2.0 - url: 'https://www.apache.org/licenses/LICENSE-2.0' - title: HyperFleet API - version: 1.0.17 -host: hyperfleet.redhat.com -basePath: / -schemes: - - https -paths: - /api/hyperfleet/v1/channels: - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/ChannelList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Channels - description: >- - Returns a paginated list of channels, optionally filtered by labels or - TSL query. - operationId: getChannels - summary: List channels - post: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ChannelCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/Channel' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Channels - description: Creates a new channel. - operationId: postChannel - summary: Create channel - '/api/hyperfleet/v1/channels/{channel_id}': - delete: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: channel_id - required: true - type: string - responses: - '202': - description: >- - The request has been accepted for processing, but processing has not - yet completed. - schema: - $ref: '#/definitions/Channel' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Channels - description: >- - Marks the channel for deletion. Returns 409 if versions still exist - (RESTRICT policy). - operationId: deleteChannelById - summary: Request channel deletion - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - in: path - name: channel_id - required: true - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Channel' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Channels - description: Returns a single channel by its ID. - operationId: getChannelById - summary: Get channel by ID - patch: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: channel_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ChannelPatchRequest' - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Channel' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Channels - description: Patches a channel by ID. Supports partial updates to spec and labels. - operationId: patchChannelById - summary: Patch channel by ID - '/api/hyperfleet/v1/channels/{channel_id}/versions': - get: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: channel_id - required: true - type: string - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/VersionList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Versions - description: Returns a paginated list of versions for a channel. - operationId: getVersionsByChannelId - summary: List versions for channel - post: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: channel_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/VersionCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/Version' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Versions - description: Creates a new version under a channel. - operationId: postVersion - summary: Create version - '/api/hyperfleet/v1/channels/{channel_id}/versions/{version_id}': - delete: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: channel_id - required: true - type: string - - in: path - name: version_id - required: true - type: string - responses: - '202': - description: >- - The request has been accepted for processing, but processing has not - yet completed. - schema: - $ref: '#/definitions/Version' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Versions - description: Marks a version for deletion. - operationId: deleteVersionById - summary: Request version deletion - get: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: channel_id - required: true - type: string - - in: path - name: version_id - required: true - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Version' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Versions - description: Returns a single version by its ID within a channel. - operationId: getVersionById - summary: Get version by ID - patch: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: channel_id - required: true - type: string - - in: path - name: version_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/VersionPatchRequest' - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Version' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Versions - description: Patch a version by ID. Supports partial updates to spec and labels. - operationId: patchVersionById - summary: Patch version by ID - /api/hyperfleet/v1/clusters: - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/ClusterList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: Returns a list of all clusters. - operationId: getClusters - summary: List clusters - post: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ClusterCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: >- - Create a new cluster resource. - - - **Note**: The `status` object in the response is read-only and computed - by the service. - - It is NOT part of the request body. Initially, - - status.conditions will include mandatory "LastKnownReconciled" and - "Reconciled" conditions. - operationId: postCluster - summary: Create cluster - '/api/hyperfleet/v1/clusters/{cluster_id}': - delete: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: cluster_id - required: true - type: string - responses: - '202': - description: >- - The request has been accepted for processing, but processing has not - yet completed. - examples: - application/json: - created_by: user-123@example.com - created_time: '2021-01-01T00:00:00Z' - deleted_by: user-123@example.com - deleted_time: '2021-01-01T10:05:00Z' - generation: 2 - href: >- - https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - labels: - environment: production - team: platform - name: cluster-123 - spec: - dns: - baseDomain: example.com - networking: - clusterNetwork: - - cidr: 10.10.0.0/16 - hostPrefix: 24 - serviceNetwork: - - 10.96.0.0/12 - platform: - gcp: - network: network-123 - projectID: project-123 - region: us-central1 - subnet: subnet-123 - zone: us-central1-a - type: gcp - release: - channelGroup: candidate - image: >- - registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4 - version: 4.22.0-ec.4 - status: - conditions: - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters reported Available=True or - Finalized=True at the current generation - observed_generation: 2 - reason: ReconciledAll - status: 'True' - type: Reconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters report Available=True for the - tracked generation - observed_generation: 2 - reason: AllAdaptersReconciled - status: 'True' - type: LastKnownReconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: This adapter1 is available - observed_generation: 2 - reason: This adapter1 is available - status: 'True' - type: Adapter1Successful - - created_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - message: This adapter2 is available - observed_generation: 2 - reason: This adapter2 is available - status: 'True' - type: Adapter2Successful - updated_by: user-123@example.com - updated_time: '2021-01-01T10:02:00Z' - schema: - $ref: '#/definitions/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: >- - Marks the cluster for deletion by setting deleted_time to the current - time, cascades to its nodepools. - - The cluster remains in the database until it is fully deleted. - - Returns the updated cluster with generation incremented. - operationId: deleteClusterById - summary: Request cluster deletion - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - in: path - name: cluster_id - required: true - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: Returns a single cluster by its ID. - operationId: getClusterById - summary: Get cluster by ID - patch: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ClusterPatchRequest' - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Cluster' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Clusters - description: Patch a specific cluster by ID - operationId: patchClusterById - summary: Patch cluster by ID - '/api/hyperfleet/v1/clusters/{cluster_id}/nodepools': - get: - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/NodePoolList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Returns the list of all nodepools for a cluster - operationId: getNodePoolsByClusterId - summary: List all nodepools for cluster - post: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/NodePoolCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/NodePoolCreateResponse' - '400': - description: The server could not understand the request due to invalid syntax. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Create a NodePool for a cluster - operationId: createNodePool - summary: Create nodepool - '/api/hyperfleet/v1/clusters/{cluster_id}/nodepools/{nodepool_id}': - delete: - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: NodePool ID - in: path - name: nodepool_id - required: true - type: string - responses: - '202': - description: >- - The request has been accepted for processing, but processing has not - yet completed. - examples: - application/json: - created_by: user-123@example.com - created_time: '2021-01-01T00:00:00Z' - deleted_by: user-123@example.com - deleted_time: '2021-01-01T10:05:00Z' - generation: 2 - href: >- - https://api.hyperfleet.com/v1/nodepools/019466a1-2b3c-7def-8abc-456789abcdef - id: 019466a1-2b3c-7def-8abc-456789abcdef - kind: NodePool - labels: - environment: production - pooltype: worker - name: worker-pool-1 - owner_references: - href: >- - https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - spec: - autoscaling: - enabled: true - maxNodes: 10 - minNodes: 1 - targetCPUUtilization: 80 - nodeCount: 3 - platform: - gcp: - diskSize: 100 - diskType: pd-standard - labels: - managedby: hyperfleet - team: platform - machineType: n1-standard-4 - preemptible: false - zones: - - us-central1-a - - us-central1-b - type: gcp - status: - conditions: - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters reported Available=True or - Finalized=True at the current generation - observed_generation: 2 - reason: ReconciledAll - status: 'True' - type: Reconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters report Available=True for the - tracked generation - observed_generation: 2 - reason: AllAdaptersReconciled - status: 'True' - type: LastKnownReconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: NodePool validation passed - observed_generation: 2 - reason: All validations passed - status: 'True' - type: ValidationSuccessful - - created_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - message: NodePool has 3 nodes running - observed_generation: 2 - reason: NodePool provisioned successfully - status: 'True' - type: NodePoolSuccessful - updated_by: user-123@example.com - updated_time: '2021-01-01T10:02:00Z' - schema: - $ref: '#/definitions/NodePool' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: >- - Marks the nodepool for deletion by setting deleted_time and deleted_by. - Does not affect the parent cluster. - - Returns the updated nodepool with generation incremented. - operationId: deleteNodePoolById - summary: Request nodepool deletion - get: - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: NodePool ID - in: path - name: nodepool_id - required: true - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/NodePool' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Returns specific nodepool - operationId: getNodePoolById - summary: Get nodepool by ID - patch: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - description: Cluster ID - in: path - name: cluster_id - required: true - type: string - - description: NodePool ID - in: path - name: nodepool_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/NodePoolPatchRequest' - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/NodePool' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Patch a specific nodepool within a cluster - operationId: patchNodePoolById - summary: Patch nodepool by ID - /api/hyperfleet/v1/nodepools: - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/NodePoolList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - NodePools - description: Returns the list of all nodepools - operationId: getNodePools - summary: List all nodepools for cluster - /api/hyperfleet/v1/resources: - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - - default: created_time - in: query - name: orderBy - required: false - type: string - - enum: - - asc - - desc - in: query - name: order - required: false - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/ResourceList' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Returns a paginated list of all resources, optionally filtered by kind, - labels, or TSL query. - operationId: getResources - summary: List resources - post: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ResourceCreateRequest' - responses: - '201': - description: >- - The request has succeeded and a new resource has been created as a - result. - schema: - $ref: '#/definitions/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Create a new resource. Only top-level entity types (no parent) can be - created - - via this endpoint. Child entities must use the nested route under their - parent. - operationId: postResource - summary: Create resource - '/api/hyperfleet/v1/resources/{resource_id}': - delete: - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: resource_id - required: true - type: string - responses: - '202': - description: >- - The request has been accepted for processing, but processing has not - yet completed. - schema: - $ref: '#/definitions/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Marks the resource for deletion. Child resources are handled per their - - OnParentDelete policy (cascade or restrict). Returns 409 if a - restrict-policy - - child exists or if another resource holds a reference to this one. - operationId: deleteResourceById - summary: Request resource deletion - get: - produces: - - application/json - - application/problem+json - parameters: - - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in - ('c1','c2')`, `labels.region='us-east'` - in: query - name: search - required: false - type: string - - in: path - name: resource_id - required: true - type: string - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: Returns a single resource by its ID. - operationId: getResourceById - summary: Get resource by ID - patch: - consumes: - - application/json - produces: - - application/json - - application/problem+json - parameters: - - in: path - name: resource_id - required: true - type: string - - in: body - name: body - required: true - schema: - $ref: '#/definitions/ResourcePatchRequest' - responses: - '200': - description: The request has succeeded. - schema: - $ref: '#/definitions/Resource' - '400': - description: The server could not understand the request due to invalid syntax. - '404': - description: The server cannot find the requested resource. - '409': - description: The request conflicts with the current state of the server. - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/Error' - security: - - BearerAuth: [] - tags: - - Resources - description: >- - Patch a resource by ID. Supports partial updates to spec, labels, and - references. - operationId: patchResourceById - summary: Patch resource by ID -definitions: - AcceleratorSpec: - properties: - count: - minimum: 1 - type: integer - type: - type: string - required: - - type - - count - type: object - AutoscalingSpec: - properties: - enabled: - type: boolean - maxNodes: - minimum: 1 - type: integer - minNodes: - minimum: 0 - type: integer - scaleDownDelay: - type: string - scaleUpDelay: - type: string - targetCPUUtilization: - maximum: 100 - minimum: 1 - type: integer - targetMemoryUtilization: - maximum: 100 - minimum: 1 - type: integer - type: object - BearerAuth: - properties: - scheme: - enum: - - bearer - type: string - type: - enum: - - http - type: string - required: - - type - - scheme - type: object - Channel: - example: - created_by: user-123@example.com - created_time: '2025-06-01T00:00:00Z' - generation: 1 - href: /api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab - id: 019466a2-1234-7abc-9def-0123456789ab - kind: Channel - labels: - tier: production - name: stable - spec: - enabled_regex: ^4\.\d+\.\d+$ - is_default: true - status: - conditions: [] - updated_by: user-123@example.com - updated_time: '2025-06-01T10:02:00Z' - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - maxLength: 63 - minLength: 1 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - spec: - $ref: '#/definitions/ChannelSpec' - status: - $ref: '#/definitions/ResourceStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - status - type: object - ChannelCreateRequest: - example: - kind: Channel - labels: - tier: production - name: stable - spec: - enabled_regex: ^4\.\d+\.\d+$ - is_default: true - properties: - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - maxLength: 63 - minLength: 1 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - spec: - $ref: '#/definitions/ChannelSpec' - required: - - name - - spec - type: object - ChannelList: - properties: - items: - items: - $ref: '#/definitions/Channel' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int32 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - ChannelPatchRequest: - additionalProperties: false - example: - labels: - tier: staging - spec: - enabled_regex: ^4\.17\.\d+$ - is_default: false - minProperties: 1 - properties: - labels: - additionalProperties: - type: string - type: object - spec: - $ref: '#/definitions/ChannelSpecUpdate' - type: object - ChannelSpec: - properties: - enabled_regex: - description: Regex pattern for matching enabled version strings - type: string - is_default: - description: Whether this is the default channel for new clusters - type: boolean - required: - - is_default - - enabled_regex - type: object - ChannelSpecUpdate: - properties: - enabled_regex: - description: Regex pattern for matching enabled version strings - type: string - is_default: - description: Whether this is the default channel for new clusters - type: boolean - type: object - Cluster: - example: - created_by: user-123@example.com - created_time: '2021-01-01T00:00:00Z' - generation: 1 - href: >- - https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - labels: - environment: production - team: platform - name: cluster-123 - spec: - dns: - baseDomain: example.com - networking: - clusterNetwork: - - cidr: 10.10.0.0/16 - hostPrefix: 24 - serviceNetwork: - - 10.96.0.0/12 - platform: - gcp: - network: network-123 - projectID: project-123 - region: us-central1 - subnet: subnet-123 - zone: us-central1-a - type: gcp - release: - channelGroup: candidate - image: >- - registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4 - version: 4.22.0-ec.4 - status: - conditions: - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters reported Available=True or Finalized=True at - the current generation - observed_generation: 1 - reason: ReconciledAll - status: 'True' - type: Reconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters report Available=True for the tracked - generation - observed_generation: 1 - reason: AllAdaptersReconciled - status: 'True' - type: LastKnownReconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: This adapter1 is available - observed_generation: 1 - reason: This adapter1 is available - status: 'True' - type: Adapter1Successful - - created_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - message: This adapter2 is available - observed_generation: 1 - reason: This adapter2 is available - status: 'True' - type: Adapter2Successful - updated_by: user-123@example.com - updated_time: '2021-01-01T10:02:00Z' - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - description: >- - Generation field is updated on customer updates, reflecting the - version of the "intent" of the customer - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: Cluster name (unique) - maxLength: 53 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - spec: - $ref: '#/definitions/ClusterSpec' - status: - $ref: '#/definitions/ClusterStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - status - type: object - ClusterCreateRequest: - example: - kind: Cluster - labels: - environment: production - team: platform - name: cluster-123 - spec: - dns: - baseDomain: example.com - networking: - clusterNetwork: - - cidr: 10.10.0.0/16 - hostPrefix: 24 - serviceNetwork: - - 10.96.0.0/12 - platform: - gcp: - network: network-123 - projectID: project-123 - region: us-central1 - subnet: subnet-123 - zone: us-central1-a - type: gcp - release: - channelGroup: candidate - image: >- - registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4 - version: 4.22.0-ec.4 - properties: - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: Cluster name (unique) - maxLength: 53 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - spec: - $ref: '#/definitions/ClusterSpec' - required: - - name - - spec - type: object - ClusterList: - properties: - items: - items: - $ref: '#/definitions/Cluster' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int32 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - ClusterNetworkEntry: - properties: - cidr: - type: string - hostPrefix: - type: integer - type: object - ClusterPatchRequest: - additionalProperties: false - example: - labels: - env: staging - spec: - dns: - baseDomain: example.com - networking: - clusterNetwork: - - cidr: 10.10.0.0/16 - hostPrefix: 24 - serviceNetwork: - - 10.96.0.0/12 - platform: - gcp: - network: network-123 - projectID: project-123 - region: us-central1 - subnet: subnet-123 - zone: us-central1-a - type: gcp - release: - channelGroup: candidate - image: >- - registry.redhat.io/openshift4/ose-cluster-version-operator:v4.22.0-ec.4 - version: 4.22.0-ec.4 - minProperties: 1 - properties: - labels: - additionalProperties: - type: string - type: object - spec: - $ref: '#/definitions/ClusterSpecUpdate' - type: object - ClusterPlatform: - properties: - network: - type: string - projectID: - type: string - region: - type: string - subnet: - type: string - zone: - type: string - type: object - ClusterPlatformSpec: - properties: - gcp: - $ref: '#/definitions/ClusterPlatform' - type: - enum: - - gcp - type: string - required: - - type - - gcp - type: object - ClusterPlatformSpecUpdate: - properties: - gcp: - $ref: '#/definitions/ClusterPlatform' - type: - enum: - - gcp - type: string - type: object - ClusterSpec: - properties: - dns: - $ref: '#/definitions/DNSSpec' - infraID: - type: string - networking: - $ref: '#/definitions/NetworkingSpec' - platform: - $ref: '#/definitions/ClusterPlatformSpec' - release: - $ref: '#/definitions/ReleaseSpec' - required: - - platform - type: object - ClusterSpecUpdate: - properties: - dns: - $ref: '#/definitions/DNSSpec' - infraID: - type: string - networking: - $ref: '#/definitions/NetworkingSpec' - platform: - $ref: '#/definitions/ClusterPlatformSpecUpdate' - release: - $ref: '#/definitions/ReleaseSpec' - type: object - ClusterStatus: - description: >- - Cluster status computed from all status conditions. - - - This object is computed by the service and CANNOT be modified directly. - - It is aggregated from condition updates posted to - `/clusters/{id}/statuses`. - - - Provides quick overview of all reported conditions. - properties: - conditions: - description: >- - List of status conditions for the cluster. - - - **Mandatory conditions**: - - - `type: "Reconciled"`: Whether the resource's desired state has been - fully reconciled by all adapters at the current generation. - - - `type: "LastKnownReconciled"`: Sticky cross-generation condition — - stays True as long as all required adapters were reconciled at a - common observed generation, even if a newer generation is being - processed. - - - These conditions are present immediately upon resource creation. - items: - $ref: '#/definitions/ResourceCondition' - minItems: 2 - type: array - required: - - conditions - type: object - DNSSpec: - properties: - baseDomain: - type: string - type: object - Error: - description: RFC 9457 Problem Details error format with HyperFleet extensions - properties: - code: - description: Machine-readable error code in HYPERFLEET-CAT-NUM format - example: HYPERFLEET-VAL-001 - type: string - detail: - description: Human-readable explanation specific to this occurrence - example: The cluster name field is required - type: string - errors: - description: Field-level validation errors (for validation failures) - items: - $ref: '#/definitions/ValidationError' - type: array - instance: - description: URI reference for this specific occurrence - example: /api/hyperfleet/v1/clusters - format: uri-reference - type: string - status: - description: HTTP status code - example: 400 - type: integer - timestamp: - description: RFC3339 timestamp of when the error occurred - example: '2024-01-15T10:30:00Z' - format: date-time - type: string - title: - description: Short human-readable summary of the problem - example: Validation Failed - type: string - trace_id: - description: Distributed trace ID for correlation - example: abc123def456 - type: string - type: - description: URI reference identifying the problem type - example: 'https://api.hyperfleet.io/errors/validation-error' - format: uri - type: string - required: - - type - - title - - status - type: object - NetworkingSpec: - properties: - clusterNetwork: - items: - $ref: '#/definitions/ClusterNetworkEntry' - type: array - serviceNetwork: - items: - type: string - type: array - type: object - NodePool: - example: - created_by: user-123@example.com - created_time: '2021-01-01T00:00:00Z' - generation: 1 - href: >- - https://api.hyperfleet.com/v1/nodepools/019466a1-2b3c-7def-8abc-456789abcdef - id: 019466a1-2b3c-7def-8abc-456789abcdef - kind: NodePool - labels: - environment: production - pooltype: worker - name: worker-pool-1 - owner_references: - href: >- - https://api.hyperfleet.com/v1/clusters/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: Cluster - spec: - autoscaling: - enabled: true - maxNodes: 10 - minNodes: 1 - targetCPUUtilization: 80 - nodeCount: 3 - platform: - gcp: - diskSize: 100 - diskType: pd-standard - labels: - managedby: hyperfleet - team: platform - machineType: n1-standard-4 - preemptible: false - zones: - - us-central1-a - - us-central1-b - type: gcp - status: - conditions: - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters reported Available=True or Finalized=True at - the current generation - observed_generation: 1 - reason: ReconciledAll - status: 'True' - type: Reconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: >- - All required adapters report Available=True for the tracked - generation - observed_generation: 1 - reason: AllAdaptersReconciled - status: 'True' - type: LastKnownReconciled - - created_time: '2021-01-01T10:00:00Z' - last_transition_time: '2021-01-01T10:00:00Z' - last_updated_time: '2021-01-01T10:00:00Z' - message: NodePool validation passed - observed_generation: 1 - reason: All validations passed - status: 'True' - type: ValidationSuccessful - - created_time: '2021-01-01T10:01:00Z' - last_transition_time: '2021-01-01T10:01:00Z' - last_updated_time: '2021-01-01T10:01:00Z' - message: NodePool has 3 nodes running - observed_generation: 1 - reason: NodePool provisioned successfully - status: 'True' - type: NodePoolSuccessful - updated_by: user-123@example.com - updated_time: '2021-01-01T10:02:00Z' - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - description: >- - Generation field is updated on customer updates, reflecting the - version of the "intent" of the customer - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: NodePool name (unique in a cluster) - maxLength: 15 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - owner_references: - $ref: '#/definitions/ObjectReference' - spec: - $ref: '#/definitions/NodePoolSpec' - status: - $ref: '#/definitions/NodePoolStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - owner_references - - status - type: object - NodePoolCreateRequest: - example: - labels: - environment: production - pooltype: worker - name: worker-pool-1 - spec: - autoscaling: - enabled: true - maxNodes: 10 - minNodes: 1 - targetCPUUtilization: 80 - nodeCount: 3 - platform: - gcp: - diskSize: 100 - diskType: pd-standard - labels: - managedby: hyperfleet - team: platform - machineType: n1-standard-4 - preemptible: false - zones: - - us-central1-a - - us-central1-b - type: gcp - properties: - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: NodePool name (unique in a cluster) - maxLength: 15 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - spec: - $ref: '#/definitions/NodePoolSpec' - required: - - name - - spec - type: object - NodePoolCreateResponse: - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - description: >- - Generation field is updated on customer updates, reflecting the - version of the "intent" of the customer - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - description: NodePool name (unique in a cluster) - maxLength: 15 - minLength: 3 - pattern: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' - type: string - owner_references: - $ref: '#/definitions/ObjectReference' - spec: - $ref: '#/definitions/NodePoolSpec' - status: - $ref: '#/definitions/NodePoolStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - owner_references - - status - type: object - NodePoolList: - properties: - items: - items: - $ref: '#/definitions/NodePool' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int32 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - NodePoolPatchRequest: - additionalProperties: false - example: - labels: - env: staging - spec: - autoscaling: - enabled: true - maxNodes: 10 - minNodes: 1 - targetCPUUtilization: 80 - nodeCount: 3 - platform: - gcp: - diskSize: 100 - diskType: pd-standard - labels: - managedby: hyperfleet - team: platform - machineType: n1-standard-4 - preemptible: false - zones: - - us-central1-a - - us-central1-b - type: gcp - minProperties: 1 - properties: - labels: - additionalProperties: - type: string - type: object - spec: - $ref: '#/definitions/NodePoolSpecUpdate' - type: object - NodePoolPlatform: - properties: - accelerators: - items: - $ref: '#/definitions/AcceleratorSpec' - type: array - diskSize: - minimum: 10 - type: integer - diskType: - enum: - - pd-standard - - pd-ssd - - pd-balanced - type: string - labels: - additionalProperties: - type: string - type: object - machineType: - type: string - preemptible: - type: boolean - taints: - items: - $ref: '#/definitions/TaintSpec' - type: array - zones: - items: - type: string - type: array - type: object - NodePoolPlatformSpec: - properties: - gcp: - $ref: '#/definitions/NodePoolPlatform' - type: - enum: - - gcp - type: string - required: - - type - - gcp - type: object - NodePoolPlatformSpecUpdate: - properties: - gcp: - $ref: '#/definitions/NodePoolPlatform' - type: - enum: - - gcp - type: string - type: object - NodePoolSpec: - properties: - autoscaling: - $ref: '#/definitions/AutoscalingSpec' - nodeCount: - minimum: 0 - type: integer - platform: - $ref: '#/definitions/NodePoolPlatformSpec' - required: - - platform - type: object - NodePoolSpecUpdate: - properties: - autoscaling: - $ref: '#/definitions/AutoscalingSpec' - nodeCount: - minimum: 0 - type: integer - platform: - $ref: '#/definitions/NodePoolPlatformSpecUpdate' - type: object - NodePoolStatus: - description: |- - NodePool status computed from all status conditions. - - This object is computed by the service and CANNOT be modified directly. - properties: - conditions: - description: >- - List of status conditions for the nodepool. - - - **Mandatory conditions**: - - - `type: "Reconciled"`: Whether the resource's desired state has been - fully reconciled by all adapters at the current generation. - - - `type: "LastKnownReconciled"`: Sticky cross-generation condition — - stays True as long as all required adapters were reconciled at a - common observed generation, even if a newer generation is being - processed. - - - These conditions are present immediately upon resource creation. - items: - $ref: '#/definitions/ResourceCondition' - minItems: 2 - type: array - required: - - conditions - type: object - ObjectReference: - properties: - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - type: object - OrderDirection: - enum: - - asc - - desc - type: string - ReleaseSpec: - properties: - channelGroup: - type: string - image: - type: string - version: - type: string - type: object - Resource: - example: - created_by: user-123@example.com - created_time: '2025-06-01T00:00:00Z' - generation: 1 - href: /api/hyperfleet/v1/resources/019466a0-8f8e-7abc-9def-0123456789ab - id: 019466a0-8f8e-7abc-9def-0123456789ab - kind: MyResource - labels: - environment: production - team: platform - name: my-resource-1 - spec: {} - status: - conditions: [] - updated_by: user-123@example.com - updated_time: '2025-06-01T10:02:00Z' - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - description: Incremented on spec or label changes - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI (computed at creation time) - type: string - id: - description: Resource identifier (UUID v7) - type: string - kind: - description: Entity type discriminator - type: string - labels: - additionalProperties: - type: string - description: Key-value pairs for filtering and grouping - type: object - name: - description: 'Resource name (unique per kind, or per kind+owner for child entities)' - maxLength: 253 - minLength: 1 - type: string - owner_references: - allOf: - - $ref: '#/definitions/ObjectReference' - description: Parent resource reference (present only on child entities) - references: - additionalProperties: - items: - $ref: '#/definitions/ObjectReference' - type: array - description: 'Non-ownership associations to other resources, keyed by reference type' - type: object - spec: - additionalProperties: {} - description: >- - Entity-specific payload, validated at runtime against the entity's - spec schema - type: object - status: - $ref: '#/definitions/ResourceStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - id - - kind - - name - - spec - - status - - generation - - created_time - - updated_time - - created_by - - updated_by - type: object - ResourceCondition: - description: >- - Condition in Cluster/NodePool status - - Used for semantic condition types: "ValidationSuccessful", - "DNSSuccessful", "NodePoolSuccessful", etc. - - Includes observed_generation and last_updated_time to track - adapter-specific state - properties: - created_time: - description: When this condition was first created (API-managed) - format: date-time - type: string - last_transition_time: - description: >- - When this condition last transitioned status (API-managed) - - Only updated when status changes (True/False), not when reason/message - changes - format: date-time - type: string - last_updated_time: - description: >- - When the corresponding adapter last reported (API-managed) - - Updated every time the adapter PUTs, even if condition status hasn't - changed - - Copied from AdapterStatus.last_report_time - format: date-time - type: string - message: - description: Human-readable message - type: string - observed_generation: - description: Generation of the spec that this condition reflects - format: int32 - type: integer - reason: - description: Machine-readable reason code - type: string - status: - $ref: '#/definitions/ResourceConditionStatus' - type: - description: Condition type - type: string - required: - - type - - last_transition_time - - status - - observed_generation - - created_time - - last_updated_time - type: object - ResourceConditionStatus: - description: Status value for resource conditions - enum: - - 'True' - - 'False' - type: string - ResourceCreateRequest: - example: - kind: MyResource - labels: - environment: production - team: platform - name: my-resource-1 - spec: {} - properties: - kind: - description: Entity type discriminator - type: string - labels: - additionalProperties: - type: string - description: Key-value pairs for filtering and grouping - type: object - name: - description: Resource name - maxLength: 253 - minLength: 1 - type: string - references: - additionalProperties: - items: - $ref: '#/definitions/ObjectReference' - type: array - description: Non-ownership associations to other resources - type: object - spec: - additionalProperties: {} - description: Entity-specific payload - type: object - required: - - kind - - name - - spec - type: object - ResourceList: - properties: - items: - items: - $ref: '#/definitions/Resource' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int64 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - ResourcePatchRequest: - additionalProperties: false - example: - labels: - env: staging - spec: {} - minProperties: 1 - properties: - labels: - additionalProperties: - type: string - type: object - references: - additionalProperties: - items: - $ref: '#/definitions/ObjectReference' - type: array - type: object - spec: - additionalProperties: {} - type: object - type: object - ResourceStatus: - description: |- - Aggregated status of the resource, populated by the status aggregation - pipeline from adapter condition reports. - properties: - conditions: - items: - $ref: '#/definitions/ResourceCondition' - type: array - required: - - conditions - type: object - TaintSpec: - properties: - effect: - enum: - - NoSchedule - - PreferNoSchedule - - NoExecute - type: string - key: - type: string - value: - type: string - required: - - key - - effect - type: object - ValidationError: - description: Field-level validation error detail - properties: - constraint: - description: The validation constraint that was violated - enum: - - required - - min - - max - - min_length - - max_length - - pattern - - enum - - format - - unique - example: required - type: string - field: - description: JSON path to the field that failed validation - example: spec.name - type: string - message: - description: Human-readable error message for this field - example: Cluster name is required - type: string - value: - description: The invalid value that was provided (if safe to include) - required: - - field - - message - type: object - Version: - example: - created_by: user-123@example.com - created_time: '2025-06-01T00:00:00Z' - generation: 1 - href: >- - /api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab/versions/019466a3-5678-7abc-9def-0123456789ab - id: 019466a3-5678-7abc-9def-0123456789ab - kind: Version - labels: {} - name: 4.17.12 - owner_references: - href: /api/hyperfleet/v1/channels/019466a2-1234-7abc-9def-0123456789ab - id: 019466a2-1234-7abc-9def-0123456789ab - kind: Channel - spec: - enabled: true - is_default: true - raw_version: 4.17.12 - release_image: 'quay.io/openshift-release-dev/ocp-release:4.17.12-multi' - status: - conditions: [] - updated_by: user-123@example.com - updated_time: '2025-06-01T10:02:00Z' - properties: - created_by: - description: Identity that created the resource - format: email - type: string - created_time: - description: Timestamp when the resource was created - format: date-time - type: string - deleted_by: - description: Identity that requested deletion; omitted if not marked for deletion - format: email - type: string - deleted_time: - description: >- - Timestamp when deletion was requested; omitted if not marked for - deletion - format: date-time - type: string - generation: - format: int32 - minimum: 1 - type: integer - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - maxLength: 63 - minLength: 1 - type: string - owner_references: - $ref: '#/definitions/ObjectReference' - spec: - $ref: '#/definitions/VersionSpec' - status: - $ref: '#/definitions/ResourceStatus' - updated_by: - description: Identity that last updated the resource - format: email - type: string - updated_time: - description: Timestamp when the resource was last updated - format: date-time - type: string - required: - - name - - spec - - created_time - - updated_time - - created_by - - updated_by - - generation - - owner_references - - status - type: object - VersionCreateRequest: - example: - kind: Version - labels: {} - name: 4.17.12 - spec: - enabled: true - is_default: true - raw_version: 4.17.12 - release_image: 'quay.io/openshift-release-dev/ocp-release:4.17.12-multi' - properties: - href: - description: Resource URI - type: string - id: - description: Resource identifier - type: string - kind: - description: Resource kind - type: string - labels: - additionalProperties: - type: string - description: 'labels for the API resource as pairs of name:value strings' - type: object - name: - maxLength: 63 - minLength: 1 - type: string - spec: - $ref: '#/definitions/VersionSpec' - required: - - name - - spec - type: object - VersionList: - properties: - items: - items: - $ref: '#/definitions/Version' - type: array - kind: - type: string - page: - format: int32 - type: integer - size: - format: int32 - type: integer - total: - format: int32 - type: integer - required: - - kind - - page - - size - - total - - items - type: object - VersionPatchRequest: - additionalProperties: false - example: - labels: - deprecated: 'true' - spec: - enabled: false - is_default: false - raw_version: 4.17.12 - release_image: 'quay.io/openshift-release-dev/ocp-release:4.17.12-multi' - minProperties: 1 - properties: - labels: - additionalProperties: - type: string - type: object - spec: - $ref: '#/definitions/VersionSpecUpdate' - type: object - VersionSpec: - properties: - enabled: - description: Whether this version is enabled for provisioning - type: boolean - end_of_life_time: - description: When this version reaches end of life - format: date-time - type: string - is_default: - description: Whether this is the default version for its channel - type: boolean - raw_version: - description: 'Raw version string (e.g., "4.17.12")' - type: string - release_image: - description: Container image reference for the release - type: string - required: - - raw_version - - enabled - - is_default - - release_image - type: object - VersionSpecUpdate: - properties: - enabled: - description: Whether this version is enabled for provisioning - type: boolean - end_of_life_time: - description: When this version reaches end of life - format: date-time - type: string - is_default: - description: Whether this is the default version for its channel - type: boolean - raw_version: - description: 'Raw version string (e.g., "4.17.12")' - type: string - release_image: - description: Container image reference for the release - type: string - type: object -securityDefinitions: - BearerAuth: - in: header - name: Authorization - type: apiKey -tags: - - name: Clusters - - name: Channels - - name: Versions - - name: NodePools - - name: Resources -x-components: - parameters: - QueryParams.order: - enum: - - asc - - desc - in: query - name: order - required: false - type: string - QueryParams.orderBy: - default: created_time - in: query - name: orderBy - required: false - type: string - QueryParams.page: - default: 1 - format: int32 - in: query - name: page - required: false - type: integer - QueryParams.pageSize: - default: 20 - format: int32 - in: query - name: pageSize - required: false - type: integer - SearchParams: - description: >- - Filter results using TSL (Tree Search Language) query syntax. - - Examples: `status.conditions.Reconciled='True'`, `name in ('c1','c2')`, - `labels.region='us-east'` - in: query - name: search - required: false - type: string - diff --git a/schemas/schemas.go b/schemas/schemas.go index 2ced3a4..a95713d 100644 --- a/schemas/schemas.go +++ b/schemas/schemas.go @@ -1,14 +1,14 @@ -// Package schemas exposes the generated HyperFleet OpenAPI schema files as an embedded filesystem. +// Package schemas exposes the generated HyperFleet core OpenAPI schema files as an embedded filesystem. // Consumers can import this package to access versioned schema content without vendoring local copies. // // Usage: // // import specschemas "github.com/openshift-hyperfleet/hyperfleet-api-spec/schemas" // -// data, err := specschemas.FS.ReadFile("gcp/openapi.yaml") +// data, err := specschemas.FS.ReadFile("core/openapi.yaml") package schemas import "embed" -//go:embed core/openapi.yaml core/swagger.yaml gcp/openapi.yaml gcp/swagger.yaml +//go:embed core/openapi.yaml var FS embed.FS diff --git a/services/channels.tsp b/services/channels.tsp deleted file mode 100644 index 161516c..0000000 --- a/services/channels.tsp +++ /dev/null @@ -1,89 +0,0 @@ -import "@typespec/http"; -import "@typespec/openapi"; -import "@typespec/openapi3"; - -import "../models-gcp/channel/model.tsp"; -import "../models/common/model.tsp"; - -using Http; -using OpenAPI; - -namespace HyperFleet; - -@tag("Channels") -@route("/channels") -@useAuth(HyperFleet.BearerAuth) -interface Channels { - /** - * Returns a paginated list of channels, optionally filtered by labels or TSL query. - */ - @get - @route("") - @summary("List channels") - @operationId("getChannels") - getChannels(...QueryParams): Body - | Error - | BadRequestResponse; - - /** - * Returns a single channel by its ID. - */ - @route("/{channel_id}") - @get - @summary("Get channel by ID") - @operationId("getChannelById") - getChannelById( - ...SearchParams, - @path channel_id: string, - ): Channel - | Error - | NotFoundResponse - | BadRequestResponse; - - /** - * Creates a new channel. - */ - @route("") - @post - @summary("Create channel") - @operationId("postChannel") - postChannel(@body body: ChannelCreateRequest): { - @statusCode statusCode: 201; - @body channel: Channel; - } | Error - | BadRequestResponse; - - /** - * Patches a channel by ID. Supports partial updates to spec and labels. - */ - @route("/{channel_id}") - @patch(#{implicitOptionality: true}) - @summary("Patch channel by ID") - @operationId("patchChannelById") - patchChannelById( - @path channel_id: string, - @body body: ChannelPatchRequest, - ): Channel - | Error - | NotFoundResponse - | BadRequestResponse - | ConflictResponse; - - /** - * Marks the channel for deletion. Returns 409 if versions still exist (RESTRICT policy). - */ - @route("/{channel_id}") - @delete - @summary("Request channel deletion") - @operationId("deleteChannelById") - deleteChannelById( - @path channel_id: string, - ): { - @statusCode statusCode: 202; - @body channel: Channel; - } | NotFoundResponse - | ConflictResponse - | Error - | BadRequestResponse; - -} diff --git a/services/versions.tsp b/services/versions.tsp deleted file mode 100644 index 989d6fe..0000000 --- a/services/versions.tsp +++ /dev/null @@ -1,96 +0,0 @@ -import "@typespec/http"; -import "@typespec/openapi"; -import "@typespec/openapi3"; - -import "../models-gcp/version/model.tsp"; -import "../models/common/model.tsp"; - -using Http; -using OpenAPI; - -namespace HyperFleet; - -@tag("Versions") -@useAuth(HyperFleet.BearerAuth) -interface Versions { - /** - * Returns a paginated list of versions for a channel. - */ - @route("/channels/{channel_id}/versions") - @get - @summary("List versions for channel") - @operationId("getVersionsByChannelId") - getVersionsByChannelId( - @path channel_id: string, - ...QueryParams, - ): Body - | Error - | BadRequestResponse; - - /** - * Creates a new version under a channel. - */ - @route("/channels/{channel_id}/versions") - @post - @summary("Create version") - @operationId("postVersion") - postVersion( - @path channel_id: string, - @body body: VersionCreateRequest, - ): { - @statusCode statusCode: 201; - @body version: Version; - } | Error - | BadRequestResponse; - - /** - * Returns a single version by its ID within a channel. - */ - @route("/channels/{channel_id}/versions/{version_id}") - @get - @summary("Get version by ID") - @operationId("getVersionById") - getVersionById( - @path channel_id: string, - @path version_id: string, - ): Version - | Error - | NotFoundResponse - | BadRequestResponse; - - /** - * Patch a version by ID. Supports partial updates to spec and labels. - */ - @route("/channels/{channel_id}/versions/{version_id}") - @patch(#{implicitOptionality: true}) - @summary("Patch version by ID") - @operationId("patchVersionById") - patchVersionById( - @path channel_id: string, - @path version_id: string, - @body body: VersionPatchRequest, - ): Version - | Error - | NotFoundResponse - | BadRequestResponse - | ConflictResponse; - - /** - * Marks a version for deletion. - */ - @route("/channels/{channel_id}/versions/{version_id}") - @delete - @summary("Request version deletion") - @operationId("deleteVersionById") - deleteVersionById( - @path channel_id: string, - @path version_id: string, - ): { - @statusCode statusCode: 202; - @body version: Version; - } | NotFoundResponse - | ConflictResponse - | Error - | BadRequestResponse; - -} diff --git a/models/clusters/model.tsp b/shared/models/clusters/model.tsp similarity index 97% rename from models/clusters/model.tsp rename to shared/models/clusters/model.tsp index 4fd3035..5f12558 100644 --- a/models/clusters/model.tsp +++ b/shared/models/clusters/model.tsp @@ -1,7 +1,6 @@ import "@typespec/openapi"; import "../common/model.tsp"; import "../statuses/model.tsp"; -import "../../aliases.tsp"; using OpenAPI; @@ -31,11 +30,11 @@ model ClusterStatus { /** * List of status conditions for the cluster. - * + * * **Mandatory conditions**: * - `type: "Reconciled"`: Whether the resource's desired state has been fully reconciled by all adapters at the current generation. * - `type: "LastKnownReconciled"`: Sticky cross-generation condition — stays True as long as all required adapters were reconciled at a common observed generation, even if a newer generation is being processed. - * + * * These conditions are present immediately upon resource creation. */ @minItems(2) diff --git a/models/common/model.tsp b/shared/models/common/model.tsp similarity index 99% rename from models/common/model.tsp rename to shared/models/common/model.tsp index 6ea77a1..21603fa 100644 --- a/models/common/model.tsp +++ b/shared/models/common/model.tsp @@ -1,5 +1,6 @@ import "@typespec/http"; import "@typespec/openapi"; +import "../statuses/model.tsp"; using Http; using OpenAPI; diff --git a/models/nodepools/model.tsp b/shared/models/nodepools/model.tsp similarity index 97% rename from models/nodepools/model.tsp rename to shared/models/nodepools/model.tsp index 59b10e1..4f5fc4f 100644 --- a/models/nodepools/model.tsp +++ b/shared/models/nodepools/model.tsp @@ -1,7 +1,6 @@ import "@typespec/openapi"; import "../common/model.tsp"; import "../statuses/model.tsp"; -import "../../aliases.tsp"; using OpenAPI; @@ -28,11 +27,11 @@ model NodePoolStatus { /** * List of status conditions for the nodepool. - * + * * **Mandatory conditions**: * - `type: "Reconciled"`: Whether the resource's desired state has been fully reconciled by all adapters at the current generation. * - `type: "LastKnownReconciled"`: Sticky cross-generation condition — stays True as long as all required adapters were reconciled at a common observed generation, even if a newer generation is being processed. - * + * * These conditions are present immediately upon resource creation. */ @minItems(2) diff --git a/models/resource/example_patch.tsp b/shared/models/resource/example_patch.tsp similarity index 100% rename from models/resource/example_patch.tsp rename to shared/models/resource/example_patch.tsp diff --git a/models/resource/example_post.tsp b/shared/models/resource/example_post.tsp similarity index 100% rename from models/resource/example_post.tsp rename to shared/models/resource/example_post.tsp diff --git a/models/resource/example_resource.tsp b/shared/models/resource/example_resource.tsp similarity index 100% rename from models/resource/example_resource.tsp rename to shared/models/resource/example_resource.tsp diff --git a/models/resource/model.tsp b/shared/models/resource/model.tsp similarity index 100% rename from models/resource/model.tsp rename to shared/models/resource/model.tsp diff --git a/models/statuses/example_adapter_status.tsp b/shared/models/statuses/example_adapter_status.tsp similarity index 97% rename from models/statuses/example_adapter_status.tsp rename to shared/models/statuses/example_adapter_status.tsp index e32ebf1..ae7b119 100644 --- a/models/statuses/example_adapter_status.tsp +++ b/shared/models/statuses/example_adapter_status.tsp @@ -1,5 +1,5 @@ -import "../../models/statuses/model.tsp"; -import "../../models/common/model.tsp"; +import "./model.tsp"; +import "../common/model.tsp"; // Example AdapterStatus for validator adapter const exampleAdapterStatus: AdapterStatus = (#{ @@ -144,4 +144,4 @@ const exampleAdapterStatusList: AdapterStatusList = (#{ last_report_time: "2021-01-01T10:01:30Z", }, ], -}); \ No newline at end of file +}); diff --git a/models/statuses/model.tsp b/shared/models/statuses/model.tsp similarity index 100% rename from models/statuses/model.tsp rename to shared/models/statuses/model.tsp diff --git a/services/clusters.tsp b/shared/services/clusters.tsp similarity index 97% rename from services/clusters.tsp rename to shared/services/clusters.tsp index be45d27..ee73c17 100644 --- a/services/clusters.tsp +++ b/shared/services/clusters.tsp @@ -31,7 +31,7 @@ interface Clusters { getClusterById( ...SearchParams, @path cluster_id: string, - ): Cluster + ): Cluster | Error | BadRequestResponse; @@ -58,7 +58,7 @@ interface Clusters { * Patch a specific cluster by ID */ @route("/{cluster_id}") - @patch(#{implicitOptionality: true}) + @patch @summary("Patch cluster by ID") @operationId("patchClusterById") patchClusterById( diff --git a/services/nodepools.tsp b/shared/services/nodepools.tsp similarity index 96% rename from services/nodepools.tsp rename to shared/services/nodepools.tsp index ffe5640..9b9a536 100644 --- a/services/nodepools.tsp +++ b/shared/services/nodepools.tsp @@ -20,7 +20,7 @@ interface NodePools { @get @summary("List all nodepools for cluster") @operationId("getNodePools") - getNodePools(...QueryParams): Body + getNodePools(...QueryParams): Body | Error | BadRequestResponse; @@ -36,7 +36,7 @@ interface NodePools { @path cluster_id: Identifier, ...QueryParams, - ): Body + ): Body | Error | BadRequestResponse; @@ -99,7 +99,7 @@ interface NodePools { * Patch a specific nodepool within a cluster */ @route("/clusters/{cluster_id}/nodepools/{nodepool_id}") - @patch(#{implicitOptionality: true}) + @patch @summary("Patch nodepool by ID") @operationId("patchNodePoolById") patchNodePoolById( diff --git a/services/resources.tsp b/shared/services/resources.tsp similarity index 98% rename from services/resources.tsp rename to shared/services/resources.tsp index 1460a45..285c4a0 100644 --- a/services/resources.tsp +++ b/shared/services/resources.tsp @@ -59,7 +59,7 @@ interface Resources { * Patch a resource by ID. Supports partial updates to spec, labels, and references. */ @route("/{resource_id}") - @patch(#{implicitOptionality: true}) + @patch @summary("Patch resource by ID") @operationId("patchResourceById") patchResourceById( diff --git a/services/statuses.tsp b/shared/services/statuses.tsp similarity index 70% rename from services/statuses.tsp rename to shared/services/statuses.tsp index 2f442f5..ac88b6f 100644 --- a/services/statuses.tsp +++ b/shared/services/statuses.tsp @@ -27,7 +27,7 @@ interface ClusterStatuses{ */ @path cluster_id: string, ...QueryParams - ): Body + ): Body | NotFoundResponse | BadRequestResponse; @@ -52,8 +52,28 @@ interface NodePoolStatuses{ @path cluster_id: string, @path nodepool_id: string, ...QueryParams - ): Body + ): Body | Error | BadRequestResponse; } + +@tag("Resource statuses") +@route("/resources/{resource_id}/statuses") +@useAuth(HyperFleet.BearerAuth) +interface ResourceStatuses { + /** + * Returns adapter statuses for a resource. + */ + @route("") + @get + @summary("List resource statuses") + @operationId("getResourceStatuses") + getResourceStatuses( + @path resource_id: string, + ...QueryParams, + ): Body + | Error + | NotFoundResponse + | BadRequestResponse; +} From 89b9f9b68e4c53040c26f221e76e7aff815a43f4 Mon Sep 17 00:00:00 2001 From: Angel Marin Date: Tue, 26 May 2026 19:57:42 +0200 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20regenerate=20core=20schema=20?= =?UTF-8?q?=E2=80=94=20add=20missing=20security=20on=20NodePool=20statuses?= =?UTF-8?q?=20GET?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- schemas/core/openapi.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/schemas/core/openapi.yaml b/schemas/core/openapi.yaml index 91f034a..e62782f 100644 --- a/schemas/core/openapi.yaml +++ b/schemas/core/openapi.yaml @@ -656,6 +656,8 @@ paths: $ref: '#/components/schemas/Error' tags: - NodePool statuses + security: + - BearerAuth: [] /api/hyperfleet/v1/clusters/{cluster_id}/statuses: put: operationId: putClusterStatuses