openapi: 3.1.0 info: title: Application Research CNAB Bundle API Resources Bundles API version: 1.0.0 description: 'API for managing Cloud Native Application Bundles (CNAB). This API provides endpoints for managing CNAB bundles, claims, claim results, dependencies, parameter sources, relocation mappings, and installation status. ' contact: name: CNAB Specification url: https://cnab.io license: name: Apache-2.0 url: https://www.apache.org/licenses/LICENSE-2.0 servers: - url: https://api.example.com/v1 description: Production server - url: https://staging-api.example.com/v1 description: Staging server security: - bearerAuth: [] - apiKey: [] tags: - name: Bundles description: Operations for managing CNAB bundle descriptors paths: /bundles: get: tags: - Bundles summary: Application Research List all bundles operationId: listBundles parameters: - $ref: '#/components/parameters/LimitParam' - $ref: '#/components/parameters/OffsetParam' - name: keyword in: query description: Filter bundles by keyword schema: type: string responses: '200': description: List of bundles content: application/json: schema: $ref: '#/components/schemas/BundleListResponse' examples: bundleList: $ref: '#/components/examples/BundleListResponse' '400': $ref: '#/components/responses/BadRequest' '500': $ref: '#/components/responses/InternalError' post: tags: - Bundles summary: Application Research Create a new bundle operationId: createBundle requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Bundle' examples: wordpress: $ref: '#/components/examples/WordPressBundle' cassandra: $ref: '#/components/examples/CassandraBundle' mlInference: $ref: '#/components/examples/MLInferenceBundle' responses: '201': description: Bundle created successfully content: application/json: schema: $ref: '#/components/schemas/Bundle' examples: wordpress: $ref: '#/components/examples/WordPressBundle' '400': $ref: '#/components/responses/BadRequest' '409': $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalError' /bundles/{name}: parameters: - $ref: '#/components/parameters/BundleNameParam' get: tags: - Bundles summary: Application Research Get a bundle by name operationId: getBundle parameters: - $ref: '#/components/parameters/VersionQueryParam' responses: '200': description: Bundle details content: application/json: schema: $ref: '#/components/schemas/Bundle' examples: wordpress: $ref: '#/components/examples/WordPressBundle' cassandra: $ref: '#/components/examples/CassandraBundle' mlInference: $ref: '#/components/examples/MLInferenceBundle' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' put: tags: - Bundles summary: Application Research Update an existing bundle operationId: updateBundle requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Bundle' examples: wordpress: $ref: '#/components/examples/WordPressBundle' responses: '200': description: Bundle updated successfully content: application/json: schema: $ref: '#/components/schemas/Bundle' examples: wordpress: $ref: '#/components/examples/WordPressBundle' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' delete: tags: - Bundles summary: Application Research Delete a bundle operationId: deleteBundle parameters: - $ref: '#/components/parameters/VersionQueryParam' responses: '204': description: Bundle deleted successfully '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' /bundles/{name}/actions/{action}: post: tags: - Bundles summary: Application Research Execute a bundle action operationId: executeBundleAction parameters: - $ref: '#/components/parameters/BundleNameParam' - $ref: '#/components/parameters/ActionParam' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/ActionExecutionRequest' examples: installWordPress: $ref: '#/components/examples/ActionExecutionRequest' responses: '202': description: Action accepted for execution content: application/json: schema: $ref: '#/components/schemas/Claim' examples: installClaim: $ref: '#/components/examples/ClaimInstall' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' components: schemas: BundleOutput: type: object description: A value produced by running an invocation image required: - definition - path properties: definition: type: string description: The name of a definition describing the schema description: type: string description: A user-friendly description of this output path: type: string description: The path inside the invocation image where output is written pattern: ^/cnab/app/outputs/.+$ applyTo: type: array description: An optional list of actions producing this output items: type: string Claim: type: object description: CNAB Claim representing an installation action required: - id - installation - action - bundle - revision - created properties: id: type: string description: The claim ID (ULID) installation: type: string description: The name of the installation action: type: string description: The name of the action (install, uninstall, upgrade, or custom) bundle: $ref: '#/components/schemas/Bundle' bundleReference: type: string description: A canonical reference to the bundle used revision: type: string description: The revision ID (ULID) created: type: string format: date-time description: The date created (ISO-8601) parameters: type: object description: Key/value pairs of parameter name to value additionalProperties: true custom: type: object description: Reserved for custom extensions additionalProperties: true Credential: type: object description: Defines a credential and where it should be placed properties: description: type: string description: A user-friendly description of this credential env: type: string description: The environment variable name for this credential path: type: string description: The path inside the invocation image for mounting credentials required: type: boolean description: Indicates whether this credential must be supplied default: false applyTo: type: array description: An optional list of actions handling this credential items: type: string InvocationImage: type: object description: A bootstrapping image for the CNAB bundle required: - image properties: image: type: string description: A resolvable reference to the image imageType: type: string description: The type of image default: oci contentDigest: type: string description: A cryptographic hash digest of the image contents size: type: integer description: The image size in bytes mediaType: type: string description: The media type of the image labels: type: object description: Key/value pairs for identifying attributes additionalProperties: type: string Action: type: object description: A custom action that can be triggered on the bundle properties: title: type: string description: A human-readable name for this action description: type: string description: A description of the purpose of this action modifies: type: boolean description: Whether the action can change any managed resource stateless: type: boolean description: Whether the action is purely informational default: false Bundle: type: object description: Cloud Native Application Bundle Descriptor (CNAB v1) required: - schemaVersion - name - version - invocationImages properties: schemaVersion: type: string description: The version of the CNAB specification const: v1 name: type: string description: The name of this bundle examples: - my-wordpress-bundle version: type: string description: A SemVer2 version for this bundle pattern: ^v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?$ examples: - 1.2.3 - 2.0.1-beta.1 description: type: string description: A description of this bundle, intended for users keywords: type: array description: A list of keywords describing the bundle items: type: string examples: - - wordpress - blog - cms maintainers: type: array description: A list of parties responsible for this bundle items: $ref: '#/components/schemas/Maintainer' license: type: string description: The SPDX license code or proprietary license name examples: - Apache-2.0 - MIT invocationImages: type: array description: The array of invocation image definitions minItems: 1 items: $ref: '#/components/schemas/InvocationImage' images: type: object description: Images used by this bundle additionalProperties: $ref: '#/components/schemas/Image' credentials: type: object description: Credentials to be injected into the invocation image additionalProperties: $ref: '#/components/schemas/Credential' parameters: type: object description: Parameters that can be injected into the invocation image additionalProperties: $ref: '#/components/schemas/Parameter' definitions: type: object description: JSON Schema definitions for parameters and outputs additionalProperties: $ref: '#/components/schemas/Definition' outputs: type: object description: Values produced by executing the invocation image additionalProperties: $ref: '#/components/schemas/BundleOutput' actions: type: object description: Custom actions that can be triggered on this bundle additionalProperties: $ref: '#/components/schemas/Action' requiredExtensions: type: array description: Extensions required for this bundle items: type: string custom: type: object description: Reserved for custom extensions additionalProperties: true Maintainer: type: object description: Information about a bundle maintainer required: - name properties: name: type: string description: Name of the maintainer email: type: string format: email description: Email address of the maintainer url: type: string format: uri description: URL for the maintainer Definition: type: - object - boolean description: JSON Schema definition for a parameter or output properties: $id: type: string format: uri-reference $schema: type: string format: uri $ref: type: string format: uri-reference $comment: type: string title: type: string description: type: string type: oneOf: - $ref: '#/components/schemas/SimpleType' - type: array items: $ref: '#/components/schemas/SimpleType' minItems: 1 uniqueItems: true default: true examples: type: array enum: type: array minItems: 1 uniqueItems: true const: true format: type: string pattern: type: string format: regex minLength: type: integer minimum: 0 maxLength: type: integer minimum: 0 minimum: type: integer maximum: type: integer exclusiveMinimum: type: integer exclusiveMaximum: type: integer multipleOf: type: integer exclusiveMinimum: 0 minItems: type: integer minimum: 0 maxItems: type: integer minimum: 0 uniqueItems: type: boolean default: false minProperties: type: integer minimum: 0 maxProperties: type: integer minimum: 0 required: type: array items: type: string uniqueItems: true properties: type: object additionalProperties: $ref: '#/components/schemas/Definition' additionalProperties: oneOf: - type: boolean - $ref: '#/components/schemas/Definition' items: oneOf: - $ref: '#/components/schemas/Definition' - type: array items: $ref: '#/components/schemas/Definition' minItems: 1 Error: type: object description: Error response required: - code - message properties: code: type: string description: Error code message: type: string description: Human-readable error message details: type: object description: Additional error details additionalProperties: true ActionExecutionRequest: type: object properties: parameters: type: object description: Parameter values for the action additionalProperties: true credentials: type: object description: Credential values for the action additionalProperties: type: string BundleListResponse: type: object properties: items: type: array items: $ref: '#/components/schemas/Bundle' total: type: integer description: Total number of bundles limit: type: integer description: Number of items per page offset: type: integer description: Current offset Parameter: type: object description: A parameter that can be passed into the invocation image required: - definition - destination properties: definition: type: string description: The name of a definition describing the schema description: type: string description: A user-friendly description of this parameter destination: $ref: '#/components/schemas/ParameterDestination' required: type: boolean description: Indicates whether this parameter must be supplied default: false applyTo: type: array description: An optional list of actions handling this parameter items: type: string SimpleType: type: string enum: - array - boolean - integer - 'null' - number - object - string Image: type: object description: An application image for this CNAB bundle required: - image properties: image: type: string description: A resolvable reference to the image imageType: type: string description: The type of image default: oci description: type: string description: A description of the purpose of this image contentDigest: type: string description: A cryptographic hash digest of the image contents size: type: integer description: The image size in bytes mediaType: type: string description: The media type of the image labels: type: object description: Key/value pairs for identifying attributes additionalProperties: type: string ParameterDestination: type: object description: Where the parameter value should be placed properties: env: type: string description: The environment variable name for the parameter value path: type: string description: The path inside the invocation image for the parameter examples: ErrorNotFound: summary: Not found error description: Example error when resource is not found value: code: NOT_FOUND message: Bundle 'my-bundle' not found ErrorBadRequest: summary: Bad request error description: Example error for invalid input value: code: BAD_REQUEST message: Invalid bundle schema details: field: version error: Version must follow SemVer2 format MLInferenceBundle: summary: ML Inference Service Bundle description: TensorFlow model deployment with Redis cache and monitoring value: schemaVersion: v1 name: ml-inference-service version: 2.0.1-beta.1 description: Deploy a TensorFlow model with Redis cache and monitoring keywords: - machine-learning - tensorflow - inference - api maintainers: - name: ML Platform Team email: ml-team@acme.corp - name: DevOps Team url: https://acme.corp/teams/devops license: MIT invocationImages: - imageType: oci image: acme.azurecr.io/ml-bundle-installer:2.0.1-beta.1 contentDigest: sha256:fedcba987654... size: 104857600 mediaType: application/vnd.oci.image.manifest.v1+json images: inference-server: imageType: oci image: tensorflow/serving:2.12.0-gpu description: TensorFlow Serving for model inference contentDigest: sha256:tf789abc... size: 2147483648 labels: component: inference gpu-enabled: 'true' redis-cache: imageType: oci image: redis:7-alpine description: Redis cache for prediction results contentDigest: sha256:redis321... prometheus: imageType: oci image: prom/prometheus:v2.45.0 description: Metrics collection and monitoring credentials: model-storage-key: description: Access key for model storage bucket path: /cnab/app/credentials/storage-key.json required: true applyTo: - install - upgrade - io.acme.model-update parameters: model-name: definition: model-name-def description: Name of the ML model to deploy destination: env: MODEL_NAME required: true model-version: definition: model-version-def description: Version of the model to deploy destination: env: MODEL_VERSION required: true definitions: model-name-def: type: string pattern: ^[a-z0-9-]+$ minLength: 3 maxLength: 50 model-version-def: type: string pattern: ^v[0-9]+\.[0-9]+\.[0-9]+$ actions: io.acme.model-update: description: Update the ML model without full redeployment modifies: true stateless: false io.acme.health-check: description: Check health of all service components modifies: false stateless: true requiredExtensions: - io.cnab.dependencies - io.cnab.parameter-sources ActionExecutionRequest: summary: Action execution request description: Example request to execute a bundle action value: parameters: site-name: My New WordPress Site replica-count: 3 credentials: db-password: secure-password-here ErrorConflict: summary: Conflict error description: Example error when resource already exists value: code: CONFLICT message: Bundle 'my-wordpress-bundle' version '1.2.3' already exists ErrorInternal: summary: Internal error description: Example internal server error value: code: INTERNAL_ERROR message: An unexpected error occurred details: requestId: req-123456 WordPressBundle: summary: WordPress Bundle Example description: A complete WordPress installation with MySQL database value: schemaVersion: v1 name: my-wordpress-bundle version: 1.2.3 description: A complete WordPress installation with MySQL database keywords: - wordpress - blog - cms - mysql maintainers: - name: Jane Developer email: jane@example.com url: https://example.com/maintainers/jane license: Apache-2.0 invocationImages: - imageType: oci image: example.com/my-wordpress-bundle:1.2.3 contentDigest: sha256:abc123def456... size: 52428800 mediaType: application/vnd.oci.image.manifest.v1+json labels: org.opencontainers.image.title: WordPress Bundle Installer images: wordpress: imageType: oci image: wordpress:6.0 description: WordPress application image contentDigest: sha256:wordpress123... mysql: imageType: oci image: mysql:8.0 description: MySQL database image contentDigest: sha256:mysql456... credentials: db-password: description: Password for the MySQL database env: MYSQL_PASSWORD required: true admin-key: description: Admin API key for WordPress path: /cnab/app/credentials/admin-key required: false applyTo: - install - upgrade parameters: site-name: definition: site-name-def description: The name of your WordPress site destination: env: WORDPRESS_SITE_NAME required: true replica-count: definition: replica-count-def description: Number of WordPress replicas to deploy destination: env: REPLICA_COUNT applyTo: - install - upgrade definitions: site-name-def: type: string minLength: 1 maxLength: 100 default: My WordPress Site replica-count-def: type: integer minimum: 1 maximum: 10 default: 2 db-connection-def: type: string description: Database connection string outputs: db-connection-string: definition: db-connection-def description: MySQL connection string for the application path: /cnab/app/outputs/db-connection applyTo: - install actions: io.example.backup: description: Creates a backup of the WordPress database and files modifies: false stateless: false io.example.restore: description: Restores WordPress from a backup modifies: true custom: io.example.metadata: category: cms tier: standard ClaimInstall: summary: Install claim example description: Example claim for an install action value: id: 01HQXYZ123456789ABCDEFGH installation: my-wordpress-prod action: install bundle: schemaVersion: v1 name: my-wordpress-bundle version: 1.2.3 invocationImages: - image: example.com/my-wordpress-bundle:1.2.3 imageType: oci bundleReference: example.com/my-wordpress-bundle:1.2.3 revision: 01HQXYZ123456789ABCDEFGI created: '2024-01-15T10:30:00Z' parameters: site-name: My Production Blog replica-count: 3 BundleListResponse: summary: Bundle list response description: Example response for listing bundles value: items: - schemaVersion: v1 name: my-wordpress-bundle version: 1.2.3 description: A complete WordPress installation with MySQL database keywords: - wordpress - blog invocationImages: - image: example.com/my-wordpress-bundle:1.2.3 imageType: oci - schemaVersion: v1 name: cassandra-cluster version: 3.11.0 description: High-availability Cassandra cluster keywords: - database - cassandra invocationImages: - image: enterprise.io/bundles/cassandra-operator:3.11.0 imageType: oci total: 2 limit: 20 offset: 0 CassandraBundle: summary: Cassandra Cluster Bundle description: High-availability Cassandra cluster with backup and monitoring value: schemaVersion: v1 name: cassandra-cluster version: 3.11.0 description: High-availability Cassandra cluster with backup automation and monitoring dashboard keywords: - database - cassandra - nosql - distributed - high-availability maintainers: - name: Database Reliability Engineering email: dre@enterprise.io url: https://enterprise.io/teams/dre license: Apache-2.0 invocationImages: - imageType: oci image: enterprise.io/bundles/cassandra-operator:3.11.0 contentDigest: sha256:9876abcd5432... size: 157286400 mediaType: application/vnd.oci.image.manifest.v1+json labels: org.opencontainers.image.authors: DRE Team org.opencontainers.image.version: 3.11.0 images: cassandra-node: imageType: oci image: cassandra:4.1.3 description: Apache Cassandra database node contentDigest: sha256:cassandra999... size: 524288000 labels: role: database cluster-ready: 'true' backup-agent: imageType: oci image: enterprise.io/cassandra-backup:2.5.0 description: Automated backup and restore agent contentDigest: sha256:backup777... monitoring-dashboard: imageType: oci image: grafana/grafana:10.1.0 description: Grafana dashboard for cluster monitoring metrics-exporter: imageType: oci image: enterprise.io/cassandra-exporter:1.3.2 description: Prometheus metrics exporter for Cassandra credentials: cassandra-admin-password: description: Administrator password for Cassandra cluster env: CASSANDRA_ADMIN_PASSWORD required: true backup-storage-credentials: description: Cloud storage credentials for backups path: /cnab/app/credentials/backup-creds.json required: true applyTo: - install - upgrade - io.enterprise.backup - io.enterprise.restore parameters: cluster-name: definition: cluster-name-def description: Unique name for the Cassandra cluster destination: env: CLUSTER_NAME required: true node-count: definition: node-count-def description: Number of Cassandra nodes in the cluster destination: env: NODE_COUNT required: true applyTo: - install - upgrade - io.enterprise.scale definitions: cluster-name-def: type: string pattern: ^[a-zA-Z][a-zA-Z0-9-]*$ minLength: 3 maxLength: 48 node-count-def: type: integer minimum: 3 maximum: 100 default: 3 actions: io.enterprise.backup: description: Create an immediate full backup of the cluster modifies: false stateless: false title: Backup Cluster io.enterprise.restore: description: Restore cluster from a backup snapshot modifies: true stateless: false title: Restore from Backup io.enterprise.scale: description: Add or remove nodes from the cluster modifies: true stateless: false title: Scale Cluster requiredExtensions: - io.cnab.dependencies - io.cnab.status custom: io.enterprise.sla: availability-target: 99.99% support-tier: enterprise parameters: ActionParam: name: action in: path required: true description: Action to execute (install, upgrade, uninstall, or custom action) schema: type: string OffsetParam: name: offset in: query description: Number of items to skip schema: type: integer minimum: 0 default: 0 VersionQueryParam: name: version in: query description: Specific version to retrieve schema: type: string LimitParam: name: limit in: query description: Maximum number of items to return schema: type: integer minimum: 1 maximum: 100 default: 20 BundleNameParam: name: name in: path required: true description: Bundle name schema: type: string responses: BadRequest: description: Bad request - invalid input content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalidSchema: $ref: '#/components/examples/ErrorBadRequest' NotFound: description: Resource not found content: application/json: schema: $ref: '#/components/schemas/Error' examples: notFound: $ref: '#/components/examples/ErrorNotFound' Conflict: description: Resource already exists content: application/json: schema: $ref: '#/components/schemas/Error' examples: conflict: $ref: '#/components/examples/ErrorConflict' InternalError: description: Internal server error content: application/json: schema: $ref: '#/components/schemas/Error' examples: internalError: $ref: '#/components/examples/ErrorInternal' securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: JWT-based authentication apiKey: type: apiKey in: header name: X-API-Key description: API key authentication