diff --git a/content/nginx-one/changelog.md b/content/nginx-one/changelog.md index 6bd27556a..db867eba0 100644 --- a/content/nginx-one/changelog.md +++ b/content/nginx-one/changelog.md @@ -30,7 +30,13 @@ h2 { Stay up-to-date with what's new and improved in the F5 NGINX One Console. -## Apr 30, 2025 +## May 19, 2025 + +### Import and export your Staged Configs + +You can now import and export your Staged Configs from the UI and with our APIs. This can help you deploy Staged Configs on the systems of your choice. + +## April 30, 2025 ### Manage RBAC access with namespaces diff --git a/content/nginx-one/how-to/staged-configs/api-staged-config.md b/content/nginx-one/how-to/staged-configs/api-staged-config.md index 8eadfdb55..ff559d014 100644 --- a/content/nginx-one/how-to/staged-configs/api-staged-config.md +++ b/content/nginx-one/how-to/staged-configs/api-staged-config.md @@ -2,11 +2,11 @@ # We use sentence case and present imperative tone title: Use the API to manage your Staged Configurations # Weights are assigned in increments of 100: determines sorting order -weight: 300 +weight: 500 # Creates a table of contents and sidebar, useful for large documents toc: true # Types have a 1:1 relationship with Hugo archetypes, so you shouldn't need to change this -type: tutorial +type: how-to # Intended for internal catalogue and search, case sensitive: product: NGINX One --- @@ -14,7 +14,16 @@ product: NGINX One You can use F5 NGINX One Console API to manage your Staged Configurations. With our API, you can: - [Create an NGINX Staged Configuration]({{< ref "/nginx-one/api/api-reference-guide/#operation/createStagedConfig" >}}) - - The details allow you to add existing configuration files. + - Use details to add existing configuration files. - [Get a list of existing Staged Configurations]({{< ref "/nginx-one/api/api-reference-guide/#operation/listStagedConfigs" >}}) - - Be sure to record the `object_id` of your target Staged Configuration for your analysis report. + - Record the `object_id` of your target Staged Configuration for your analysis report. - [Get an analysis report for an existing Staged Configuration]({{< ref "/nginx-one/api/api-reference-guide/#operation/getStagedConfigReport" >}}) + - Review the same recommendations found in the UI. +- [Export a Staged Configuration]({{< ref "/nginx-one/api/api-reference-guide/#operation/exportStagedConfig" >}}) + - Exports an existing Staged Configuration from the console. It sends you an archive of that configuration in `tar.gz` format. +- [Import a Staged Configuration]({{< ref "/nginx-one/api/api-reference-guide/#operation/importStagedConfig" >}}) + - Imports an existing Staged Configuration from your system and sends it to the console. This REST call assumes that your configuration is archived in `tar.gz` format. +- [Bulk manage multiple Staged Configurations]({{< ref "/nginx-one/api/api-reference-guide/#operation/bulkStagedConfigs" >}}) + - Allows you to delete multiple Staged Configurations. Requires each `object_id`. + + For several API endpoints, we ask for a `conf_path`. Make sure to set an absolute file path. If you make a REST call without an absolute file path, you'll see a 400 error message. diff --git a/content/nginx-one/how-to/staged-configs/import-export-staged-config.md b/content/nginx-one/how-to/staged-configs/import-export-staged-config.md new file mode 100644 index 000000000..192fad4c4 --- /dev/null +++ b/content/nginx-one/how-to/staged-configs/import-export-staged-config.md @@ -0,0 +1,89 @@ +--- +# We use sentence case and present imperative tone +title: Import and export a Staged Configuration +# Weights are assigned in increments of 100: determines sorting order +weight: 300 +# Creates a table of contents and sidebar, useful for large documents +toc: true +# Types have a 1:1 relationship with Hugo archetypes, so you shouldn't need to change this +type: how-to +# Intended for internal catalogue and search, case sensitive: +# Agent, N4Azure, NIC, NIM, NGF, NAP-DOS, NAP-WAF, NGINX One, NGINX+, Solutions, Unit +product: NGINX One +--- + +## Overview + +Many administrators do their work on local systems, virtual machines, Docker containers, and more. F5 NGINX One Console +supports import and export of such configurations. +This guide explains how to import or export a Staged Configuration to your NGINX One Console. + +{{< include "nginx-one/staged-config-overview.md" >}} + +## Before you start + +Before you import or export a Staged Configuration to NGINX One Console, ensure: + +- You have an NGINX One Console account with staged configuration permissions. + +You can also import, export, and manage multiple Staged Configurations through [the API]({{< ref "/nginx-one/how-to/staged-configs/api-staged-config.md" >}}). + +## Considerations + +NGINX One Console supports imports and exports as a compressed archive known as a [tarball](https://en.wikipedia.org/wiki/Tar_(computing)), in `tar.gz` format. +When you work with such archives, consider the following: + +- Do _not_ unpack archives directly to your NGINX configuration directories. You do not want to accidentally overwrite existing configuration files. +- The files are set to a default file permission mode of 0644. +- Do not include files with secrets or personally identifying information. +- We ignore hidden files. + - If you import or export such files in archives, NGINX One Console does not include those files. +- The size of the archive is limited to 5 MB. The size of all uncompressed files in the archive is limited to 10 MB. + +{{< tip >}} + +Before you unpack an archive, run the `tar -tvzf .tar.gz` command. It displays the files and directories in that archive, without overwriting anything. +You'll then know where files are written when you extract an archive with a command like `tar -xvzf .tar.gz`. + +{{< /tip >}} + +## Import a Staged Configuration + +To import a Staged Configuration from your system to the NGINX One Console, you need to: + +- Package your configuration in `tar.gz` format. For example, the following command creates an archive file named for-import.tar.gz` from files in the `/etc/nginx` directory: + ```bash + tar czvf /etc/nginx for-import.tar.gz + ``` + +You would then import that file to the NGINX One Console. To do so, follow these steps: + +1. On the left menu, select **Staged Configurations**. +1. Select **Add Staged Configuration**. +1. Select **Import Configuration**. +1. Add a name for the Staged Configuration to be imported. +1. Select **Import from File**. +1. Choose the file. The process depends on your operating system. +1. If successful, you'll see a success message. + - A typical error suggests that the file is too large. + +## Export a Staged Configuration + +You can export a Staged Configuration from the NGINX One Console, as a download, to your system. To do so, follow these steps: + +1. On the left menu, select **Staged Configurations**. +1. Select the Staged Configuration you want to export. +1. Select the ellipsis (...) on the right side of the row with the Staged Configuration. +1. Select **Export** +1. In the file menu that appears, choose a filename for your archive and save the result +1. Be careful. Do not unpack the archive in a way that overwrites your current NGINX configuration. + +## Manage multiple Staged Configurations + +You can also delete multiple Staged Configurations through the UI: + +1. On the left menu, select **Staged Configurations**. +1. Select the Staged Configuration you want to delete. +1. You can then select the **Delete selected** button. + +You can do more from the API. Specifically, with the `object_id` of each configuration, you can create, modify, or delete multiple staged configurations with the [Bulk Staged Configurations endpoint]({{< ref "/nginx-one/api/api-reference-guide/#operation/bulkStagedConfigs" >}}). diff --git a/static/nginx-one/api/one.json b/static/nginx-one/api/one.json index 500ad58aa..ba89c7505 100644 --- a/static/nginx-one/api/one.json +++ b/static/nginx-one/api/one.json @@ -18,6 +18,17 @@ "default": "tenant-example" } } + }, + { + "url": "/api/v1/marketplace" + }, + { + "url": "/api/v1/namespaces/{namespace}", + "variables": { + "namespace": { + "default": "default" + } + } } ], "tags": [ @@ -63,6 +74,26 @@ "name": "Settings", "description": "Configuration option for different aspect of NGINX One service.\nYou can set NGINX Instance cleanup preferences.\n", "x-displayName": "Settings" + }, + { + "name": "Authorization", + "description": "Facilitate user authentication and authorization.", + "x-displayName": "Authorization" + }, + { + "name": "Signup", + "description": "Manage account activation and first user creation.", + "x-displayName": "Signup" + }, + { + "name": "User", + "description": "Manage cloud users.", + "x-displayName": "User" + }, + { + "name": "Deployments", + "description": "Manage NAAS deployments.", + "x-displayName": "Deployments" } ], "paths": { @@ -2563,7 +2594,7 @@ "x-nginx-one-action": "create", "x-nginx-one-entity": "NGINX instance configuration", "summary": "Publish a configuration to an instance", - "description": "Publishes a new or updated NGINX configuration to the specified instance. \nIf no existing configuration is found, a new one is created; otherwise, the current configuration is overwritten. \nBefore publishing, use the `PUT /instances/{instanceObjectID}/config-report` endpoint to generate an analysis report for the provided configuration.\nYou can specify `payloads` in the request to deploy managed certificates and keys to the dataplane. Include file paths\nfor each payload component.\n", + "description": "Publishes a new or updated NGINX configuration to the specified instance.\nIn the specified `configs`, empty files are not allowed in the directory.\nIf no existing configuration is found, a new one is created; otherwise, the current configuration is overwritten. \nBefore publishing, use the `PUT /instances/{instanceObjectID}/config-report` endpoint to generate an analysis report for the provided configuration.\nYou can specify `payloads` in the request to deploy managed certificates and keys to the dataplane. Include file paths\nfor each payload component.\n", "operationId": "publishInstanceConfig", "requestBody": { "required": true, @@ -3223,6 +3254,59 @@ } } }, + "patch": { + "x-nginx-one-action": "bulk", + "x-nginx-one-entity": "NGINX staged configs", + "x-feature-flag": "staged-configs-phase-2", + "tags": [ + "Staged Configs" + ], + "summary": "Bulk operation on multiple staged configs", + "operationId": "bulkStagedConfigs", + "description": "Performs bulk operation on one or more staged configs, only delete is supported.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StagedConfigBulkRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Batch request completed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StagedConfigBulkResponse" + } + } + } + }, + "401": { + "description": "Access denied.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "An unexpected error occurred on the server. Please try the request again later.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, "post": { "x-feature-flag": "staged-configs", "x-nginx-one-action": "create", @@ -3729,6 +3813,153 @@ } } }, + "/staged-configs/{stagedConfigObjectID}/export": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/StagedConfigParamObjectID" + } + ], + "tags": [ + "Staged Configs" + ], + "x-feature-flag": "staged-configs-phase-2", + "x-nginx-one-action": "export", + "x-nginx-one-entity": "NGINX staged config", + "summary": "Export staged configuration", + "description": "Exports staged configuration as a gzipped tar archive. Does not include sensitive data such as SSL certificates. [Learn more](https://docs.nginx.com/nginx-one/how-to/staged-configs/import-export-staged-config/).\n", + "operationId": "exportStagedConfig", + "responses": { + "200": { + "description": "Successfully exported the staged configuration.", + "content": { + "application/gzip": { + "schema": { + "type": "string", + "format": "binary", + "example": "my-staged-config-2025-01-01T20_25_03.tar.gz" + } + } + } + }, + "401": { + "description": "Access denied", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "The NGINX staged config with the specified object_id was not found. Check that the object_id provided is correct and corresponds to an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "An unexpected error occurred on the server. Please try the request again later.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/staged-configs/import": { + "post": { + "tags": [ + "Staged Configs" + ], + "x-feature-flag": "staged-configs-phase-2", + "x-nginx-one-action": "import", + "x-nginx-one-entity": "NGINX staged config", + "summary": "Import staged configuration\n", + "description": "Imports a gzipped tar archive (.tar.gz) containing configuration and aux files into NGINX One. \nOnly non-hidden files are included in the import.\n\nMaximum compressed archive size: **5 MB**\nMaximum uncompressed individual file size: **10 MB**\n\nIf `parse_only` is set to `true`, the configuration is only validated and not staged.\nBy default, validation is performed and a staged configuration is created upon success.\n", + "parameters": [ + { + "$ref": "#/components/parameters/StagedConfigImportParseOnly" + } + ], + "operationId": "importStagedConfig", + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/StagedConfigImportRequest" + }, + "encoding": { + "file": { + "contentType": "application/gzip" + } + } + } + } + }, + "responses": { + "200": { + "description": "Return if `parse_only` is `true`: Returns data matching `StagedConfigCreateRequest` that can be used to create the staged config later. \n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StagedConfigCreateRequest" + } + } + } + }, + "201": { + "description": "Return if `parse_only` is `false` or omitted: Confirms the import parsed successfully and the staged config was created.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StagedConfigCreateResponse" + } + } + } + }, + "400": { + "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Access denied", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "An unexpected error occurred on the server. Please try the request again later.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, "/monitor/metrics_query_topx": { "post": { "tags": [ @@ -3750,7 +3981,7 @@ "metrics": [ { "aggregate": "sum", - "name": "nginx.http.requests" + "name": "nginx.http.request.count" } ], "series_limit": 1, @@ -3865,67 +4096,495 @@ } } } - } - }, - "components": { - "parameters": { - "Paginated": { - "name": "paginated", - "in": "query", - "schema": { - "type": "boolean", - "default": true - }, - "description": "A boolean indicating if the results should be presented as a paginated list. Defaults to `true`. \nWhen set to `false`, the results are returned as a condensed, non-paginated list.\n", - "required": false - }, - "Limit": { - "name": "limit", - "in": "query", - "schema": { - "type": "integer", - "minimum": 0 - }, - "description": "An integer that specifies the maximum number of items to be returned. \nSetting this to `0` will result in no items being returned, but a total count will still be provided. \nThis parameter is not applicable if `paginated` is `false`.\n", - "required": false - }, - "Offset": { - "name": "offset", - "in": "query", - "schema": { - "type": "integer", - "minimum": 1 - }, - "description": "An integer that specifies the starting position of the results, starting at `1`.\nThis parameter is not applicable if `paginated` is `false`.\n" - }, - "FilterFieldDataPlaneKeys": { - "name": "filter_fields", - "in": "query", - "description": "Filter options for data plane keys; used in conjunction with other filter parameters having the same array length.\n\nWhen filtering on `status`, only the following `filter_values` are supported:\n * revoked\n * expired\n * valid\n", - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FilterNameDataPlaneKeys" + }, + "/auth/google/authorize": { + "get": { + "tags": [ + "Authorization" + ], + "summary": "Returns a redirect to authenticate with Google.", + "operationId": "googleAuthorize", + "responses": { + "302": { + "description": "Redirect to authenticate with Google." + }, + "500": { + "description": "An unexpected error occurred on the server. Please try the request again later.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } } - }, - "FilterOperands": { - "name": "filter_ops", - "in": "query", - "description": "An array of strings defining the operands for filtering, to be used in conjunction with `filter_fields` and `filter_values`. \nAll filter parameters must have matching array lengths. Currently, the only supported operand is `\"IN\"`.\n", - "schema": { - "$ref": "#/components/schemas/FilterOperands" - } - }, - "FilterValues": { - "name": "filter_values", - "in": "query", - "description": "An array of strings containing the keywords for filtering. \nMultiple keywords can be chained using the `|` character. \nEnsure this parameter's array length matches those of `filter_fields` and `filter_ops` for effective filtering.\nThe total length of the filter string should not exceed 1024 characters.\n", - "schema": { - "type": "array", - "items": { - "type": "string", - "example": "value1|value2|value3", + } + }, + "/auth/google/callback": { + "get": { + "tags": [ + "Authorization" + ], + "summary": "Callback after the Google login page.", + "description": "The Google callback endpoint is where the user will be redirected after logging in and authorizing our service. This callback carries the Google code we exchange for an authorization token.\n", + "operationId": "googleCallback", + "parameters": [ + { + "name": "code", + "in": "query", + "required": true, + "description": "The authorization code returned by the Google authorization server.", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "required": true, + "description": "A signed state parameter used to mitigate CSRF attacks. In some cases, this may additionally be used to carry needed state from the redirect back to the callback.\n", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Authorization has been granted and an access token is generated. Use the returned access token to\nauthenticate future API requests.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthGoogleCallbackResponse" + } + } + } + }, + "401": { + "description": "The request is either missing or provided invalid input.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "The request contains valid input, but authorization cannot be granted." + }, + "500": { + "description": "An unexpected error occurred on the server. Please try the request again later.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/auth/google/signup": { + "post": { + "tags": [ + "Signup" + ], + "summary": "Creates an account and first user.", + "operationId": "googleSignup", + "requestBody": { + "description": "Completed sign up form with Google account and user identity from the\nmarketplace token.\n", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SignupWithGoogleRequest" + } + } + } + }, + "responses": { + "200": { + "description": "The new account has been activated and first user created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SignupWithGoogleResponse" + } + } + } + }, + "400": { + "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "An unexpected error occurred on the server. Please try the request again later.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/users": { + "post": { + "tags": [ + "User" + ], + "x-nginx-one-action": "create", + "x-nginx-one-entity": "user", + "summary": "Create a user", + "description": "Creates a cloud user.", + "operationId": "createUser", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudUserCreateRequest" + }, + "examples": { + "CloudUserCreateRequest": { + "$ref": "#/components/examples/CloudUserResponse" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully created the cloud user.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudUser" + } + } + } + }, + "400": { + "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "An unexpected error occurred on the server. Please try the request again later.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/deployments": { + "get": { + "tags": [ + "Deployments" + ], + "summary": "List deployments", + "description": "Returns a list of deployments.", + "operationId": "listDeployments", + "responses": { + "200": { + "description": "Successfully returned the list of deployments.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeploymentListResponse" + }, + "examples": { + "DeploymentListResponse": { + "$ref": "#/components/examples/DeploymentListResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/InvalidRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerErr" + } + } + }, + "post": { + "tags": [ + "Deployments" + ], + "summary": "Create deployment", + "description": "Creates a new deployment.", + "operationId": "createDeployment", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeploymentCreateRequest" + }, + "examples": { + "DeploymentCreateRequest": { + "$ref": "#/components/examples/DeploymentCreateRequest" + } + } + } + } + }, + "responses": { + "202": { + "description": "Successfully created the deployment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Deployment" + }, + "examples": { + "DeploymentCreateResponse": { + "$ref": "#/components/examples/DeploymentCreateResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/InvalidRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerErr" + } + } + } + }, + "/deployments/{deployment_id}": { + "delete": { + "tags": [ + "Deployments" + ], + "summary": "Delete deployment", + "description": "Deletes the specified deployment.", + "operationId": "deleteDeployment", + "parameters": [ + { + "$ref": "#/components/parameters/DeploymentObjectID" + } + ], + "responses": { + "202": { + "description": "Successfully deleted the deployment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Deployment" + }, + "examples": { + "DeploymentDeleteResponse": { + "$ref": "#/components/examples/DeploymentDeleteResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerErr" + } + } + }, + "get": { + "tags": [ + "Deployments" + ], + "summary": "Get deployment", + "description": "Returns deployment details.", + "operationId": "getDeployment", + "parameters": [ + { + "$ref": "#/components/parameters/DeploymentObjectID" + } + ], + "responses": { + "200": { + "description": "Successfully returned the deployment details.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Deployment" + }, + "examples": { + "DeploymentGetResponse": { + "$ref": "#/components/examples/DeploymentGetResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/InvalidRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerErr" + } + } + }, + "patch": { + "tags": [ + "Deployments" + ], + "summary": "Update deployment", + "description": "Updates the specified deployment.", + "operationId": "updateDeployment", + "parameters": [ + { + "$ref": "#/components/parameters/DeploymentObjectID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeploymentUpdateRequest" + }, + "examples": { + "DeploymentUpdateRequest": { + "$ref": "#/components/examples/DeploymentUpdateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the deployment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Deployment" + }, + "examples": { + "DeploymentUpdateResponse": { + "$ref": "#/components/examples/DeploymentUpdateResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/InvalidRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalServerErr" + } + } + } + } + }, + "components": { + "parameters": { + "Paginated": { + "name": "paginated", + "in": "query", + "schema": { + "type": "boolean", + "default": true + }, + "description": "A boolean indicating if the results should be presented as a paginated list. Defaults to `true`. \nWhen set to `false` a maximum of 3000 results are returned.\n", + "required": false + }, + "Limit": { + "name": "limit", + "in": "query", + "schema": { + "type": "integer", + "minimum": 0 + }, + "description": "An integer that specifies the maximum number of items to be returned. \nSetting this to `0` will result in no items being returned, but a total count will still be provided. \nThis parameter is not applicable if `paginated` is `false`.\n", + "required": false + }, + "Offset": { + "name": "offset", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1 + }, + "description": "An integer that specifies the starting position of the results, starting at `1`.\nThis parameter is not applicable if `paginated` is `false`.\n" + }, + "FilterFieldDataPlaneKeys": { + "name": "filter_fields", + "in": "query", + "description": "Filter options for data plane keys; used in conjunction with other filter parameters having the same array length.\n\nWhen filtering on `status`, only the following `filter_values` are supported:\n * revoked\n * expired\n * valid\n", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FilterNameDataPlaneKeys" + } + } + }, + "FilterOperands": { + "name": "filter_ops", + "in": "query", + "description": "An array of strings defining the operands for filtering, to be used in conjunction with `filter_fields` and `filter_values`. \nAll filter parameters must have matching array lengths. Currently, the only supported operand is `\"IN\"`.\n", + "schema": { + "$ref": "#/components/schemas/FilterOperands" + } + }, + "FilterValues": { + "name": "filter_values", + "in": "query", + "description": "An array of strings containing the keywords for filtering. \nMultiple keywords can be chained using the `|` character. \nEnsure this parameter's array length matches those of `filter_fields` and `filter_ops` for effective filtering.\nThe total length of the filter string should not exceed 1024 characters.\n", + "schema": { + "type": "array", + "items": { + "type": "string", + "example": "value1|value2|value3", "minLength": 1, "maxLength": 1024 } @@ -4067,7 +4726,7 @@ "name": "configSyncGroupObjectID", "in": "path", "schema": { - "$ref": "#/components/schemas/configSyncGroupObjectID" + "$ref": "#/components/schemas/ConfigSyncGroupObjectID" }, "description": "A globally unique identifier for the NGINX config sync group.\n", "required": true @@ -4248,6 +4907,25 @@ }, "description": "A globally unique identifier for the NGINX staged config.\n", "required": true + }, + "StagedConfigImportParseOnly": { + "name": "parseOnly", + "in": "query", + "schema": { + "type": "boolean", + "default": false + }, + "description": "Optional flag to control how the request is processed.\n - When `false` or omitted (by default), the request creates a Staged Config directly. (`StagedConfigCreateResponse`)\n - When `true`, the request parses the import and returns metadata you can use to create a Staged Config through a POST. ( `StagedConfigCreateRequest`)\n", + "required": false + }, + "DeploymentObjectID": { + "name": "deployment_id", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DeploymentObjectID" + }, + "description": "A globally unique identifier for the deployment.", + "required": true } }, "schemas": { @@ -4290,11 +4968,11 @@ "properties": { "total": { "type": "integer", - "description": "The absolute total number of the resource in the NGINX One Console.\n" + "description": "The absolute total number of the resource in the NGINX One Console, ignoring any filter(s).\n" }, "count": { "type": "integer", - "description": "The total number of results generated by the list or query operation. \nThis number might be greater than the number of displayed resources, such as when pagination is in effect.\n" + "description": "The total number of results generated by the list or query operation, accounting for any filter(s).\nThis number can be greater than the number of returned resources when pagination is in effect and a page size limit (or maximum allowed) is reached.\n" }, "start_index": { "type": "integer", @@ -5281,7 +5959,7 @@ "filter_name_config_sync_group_object_id" ] }, - "configSyncGroupObjectID": { + "ConfigSyncGroupObjectID": { "description": "A globally unique identifier for the NGINX config sync group.", "type": "string", "format": "object_id", @@ -5352,7 +6030,7 @@ ], "properties": { "object_id": { - "$ref": "#/components/schemas/configSyncGroupObjectID" + "$ref": "#/components/schemas/ConfigSyncGroupObjectID" }, "name": { "description": "Name of the Nginx config sync group.", @@ -5432,7 +6110,7 @@ ], "properties": { "object_id": { - "$ref": "#/components/schemas/configSyncGroupObjectID" + "$ref": "#/components/schemas/ConfigSyncGroupObjectID" }, "name": { "description": "Name of the Nginx config sync group.", @@ -5453,7 +6131,7 @@ ], "properties": { "object_id": { - "$ref": "#/components/schemas/configSyncGroupObjectID" + "$ref": "#/components/schemas/ConfigSyncGroupObjectID" }, "action": { "$ref": "#/components/schemas/BulkRequestAction" @@ -5498,7 +6176,7 @@ ], "properties": { "object_id": { - "$ref": "#/components/schemas/configSyncGroupObjectID" + "$ref": "#/components/schemas/ConfigSyncGroupObjectID" }, "name": { "description": "Name of the Nginx config sync group.", @@ -5548,6 +6226,23 @@ } } }, + "NginxAppProtectDetails": { + "description": "Information regarding NGINX App Protect.\n", + "type": "object", + "required": [ + "engine_version" + ], + "properties": { + "release_version": { + "description": "The release version of NGINX App Protect.", + "type": "string" + }, + "engine_version": { + "description": "The version of the App Protect enforcement engine.", + "type": "string" + } + } + }, "CveSeverityType": { "type": "string", "description": "Severity ratings:\n * `high` - High severity.\n * `medium` - Moderate severity.\n * `low` - Least severe.\n * `none` - Not severe.\n * `other` - Severity that does not fit the other categories.\n", @@ -5659,6 +6354,9 @@ "type": "string", "example": "ubuntu_jammy" }, + "nginx_app_protect": { + "$ref": "#/components/schemas/NginxAppProtectDetails" + }, "registered_at": { "description": "The date and time when the NGINX instance first registered with NGINX One.", "type": "string", @@ -5893,6 +6591,13 @@ } ] }, + "ConfigPath": { + "type": "string", + "minLength": 1, + "maxLength": 4096, + "description": "The full path to the main NGINX configuration file. This corresponds to the `--conf-path` parameter used in the NGINX binary.\n", + "example": "/etc/nginx/nginx.conf." + }, "FileData": { "type": "object", "description": "Details about a file, including its path, content, size, and last modified time.", @@ -5969,11 +6674,7 @@ "description": "A hash that uniquely identifies the contents of the config object. Can be used to detect change when updating the NginxConfig.\n" }, "conf_path": { - "type": "string", - "minLength": 1, - "maxLength": 4096, - "description": "The full path to the main NGINX configuration file. This corresponds to the `--conf-path` parameter used in the NGINX binary.\n", - "example": "/etc/nginx/nginx.conf." + "$ref": "#/components/schemas/ConfigPath" }, "configs": { "type": "array", @@ -6207,11 +6908,7 @@ "description": "A hash that uniquely identifies the contents of the config object. Can be used to detect change when updating the NginxConfig.\n" }, "conf_path": { - "type": "string", - "minLength": 1, - "maxLength": 4096, - "description": "The full path to the main NGINX configuration file. This corresponds to the `--conf-path` parameter used in the NGINX binary.\n", - "example": "/etc/nginx/nginx.conf." + "$ref": "#/components/schemas/ConfigPath" }, "configs": { "type": "array", @@ -7423,7 +8120,6 @@ "config": { "aux": [], "conf_path": "/etc/nginx/nginx.conf", - "config_version": "c039fbbd5d7f73d894390fb446bd3690da099ed8862b2527299bc2ba", "configs": [ { "files": [ @@ -7458,6 +8154,51 @@ "object_id": "sc_Tet21AeYTHCj7taOwVfzyw" } }, + "StagedConfigBulkRequestData": { + "type": "object", + "description": "Part of bulk operation on a staged config, only `delete` is supported.", + "required": [ + "action", + "object_id" + ], + "properties": { + "object_id": { + "$ref": "#/components/schemas/StagedConfigObjectID" + }, + "action": { + "$ref": "#/components/schemas/BulkRequestAction" + } + }, + "example": { + "object_id": "sc_-uvR3F2TQGm18jnl7bpaGw", + "action": "delete" + } + }, + "StagedConfigBulkRequest": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StagedConfigBulkRequestData" + }, + "minItems": 1, + "maxItems": 50, + "example": [ + { + "object_id": "sc_-uvR3F2TQGm18jnl7bpaGw", + "action": "delete" + }, + { + "object_id": "sc_PL0c1XodRemmzVEjiXSsTg", + "action": "delete" + } + ] + }, + "StagedConfigBulkResponse": { + "description": "The staged config bulk outcome.", + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkRequestObjectStatus" + } + }, "StagedConfigResponse": { "description": "Get an NGINX staged config.", "required": [ @@ -7536,6 +8277,35 @@ } } }, + "StagedConfigImportRequest": { + "type": "object", + "description": "Body to import a NGINX staged config", + "required": [ + "name", + "file", + "conf_path" + ], + "properties": { + "name": { + "$ref": "#/components/schemas/StagedConfigName" + }, + "file": { + "type": "string", + "format": "binary", + "example": "my-staged-config.tar.gz", + "maxLength": 5242880 + }, + "conf_path": { + "$ref": "#/components/schemas/ConfigPath" + } + }, + "example": { + "name": "my-nginx-config", + "file": "my-staged-config.tar.gz", + "conf_path": "/etc/nginx/nginx.conf", + "parse_only": true + } + }, "MetricQueryResultEx": { "type": "object", "required": [ @@ -7734,7 +8504,7 @@ "MetricDimension": { "type": "string", "default": "display_name", - "description": "Static list of all metric dimensions.\n * `display_name` - The display name of the NGINX instance.\n * `file_path` - Path to a desired file.\n * `parent_hostname` - The hostname of the NGINX Plus instance.\n * `instance_object_id` - Instance Object ID is the unique identifier for an Instance registered with NGINX One Console.\n * `location_zone` - The name of an HTTP location zone.\n * `mount_point` - A filesystem mount point.\n * `namespace` - The Namespace associated with the metric data.\n * `network_interface` - A server network interface.\n * `nginx_id` - The unique identifier of an nginx instance running on the data plane.\n * `server_zone` - The name of an HTTP or Stream server zone.\n * `system_id` - The unique identifier of the the operating system where nginx-agent is running.\n * `tenant` - The Tenant associated with the metric data.\n * `csg_object_id` - Config Sync Group Object ID is the unique identifier for a Config Sync Group registered with NGINX One Console.\n * `mode` - Variant value associated with metric `system.cpu.time`.\n * `state` - Variant value associated with metrics `system.filesystem.usage`, `system.memory.usage`.\n * `io_direction` - Variant value associated with metric `system.network.io`.\n * `status_range` - Variant value associated with metric `nginx.http.response.status`.\n", + "description": "Static list of all metric dimensions.\n * `display_name` - The display name of the NGINX instance.\n * `file_path` - Path to a desired file.\n * `parent_hostname` - The hostname of the NGINX Plus instance.\n * `instance_object_id` - Instance Object ID is the unique identifier for an Instance registered with NGINX One Console.\n * `location_zone` - The name of an HTTP location zone.\n * `mount_point` - A filesystem mount point.\n * `namespace` - The Namespace associated with the metric data.\n * `network_interface` - A server network interface.\n * `nginx_id` - The unique identifier of an nginx instance running on the data plane.\n * `server_zone` - The name of an HTTP or Stream server zone.\n * `system_id` - The unique identifier of the the operating system where nginx-agent is running.\n * `tenant` - The Tenant associated with the metric data.\n * `csg_object_id` - Config Sync Group Object ID is the unique identifier for a Config Sync Group registered with NGINX One Console.\n * `mode` - Variant value associated with metric `system.cpu.utilization`.\n * `state` - Variant value associated with metrics `system.filesystem.usage`, `system.memory.usage`.\n * `io_direction` - Variant value associated with metric `system.network.io`.\n * `status_range` - Variant value associated with metric `nginx.http.response.count`.\n", "enum": [ "display_name", "file_path", @@ -7864,7 +8634,7 @@ }, "example": [ { - "name": "system.cpu.time", + "name": "system.cpu.utilization", "aggregate": "avg", "filter": [ { @@ -8053,10 +8823,10 @@ "MetricName": { "type": "string", "description": "Metric names available for querying.\n", - "example": "nginx.http.requests", + "example": "nginx.http.request.count", "oneOf": [ { - "$ref": "#/components/schemas/MetricSystemCpuTime" + "$ref": "#/components/schemas/MetricSystemCpuUtilization" }, { "$ref": "#/components/schemas/MetricSystemFilesystemUsage" @@ -8071,18 +8841,18 @@ "$ref": "#/components/schemas/MetricSystemNetworkIo" }, { - "$ref": "#/components/schemas/MetricNginxHttpRequests" + "$ref": "#/components/schemas/MetricNginxHttpRequestCount" }, { - "$ref": "#/components/schemas/MetricNginxHttpResponseStatus" + "$ref": "#/components/schemas/MetricNginxHttpResponseCount" } ] }, - "MetricSystemCpuTime": { + "MetricSystemCpuUtilization": { "type": "string", "description": "Total system CPU utilization for 'system' or 'user', percentage. A filter differentiator is needed for specific mode(s).\n\nReplacement for depreciated variant(s):\n * system.cpu.system\n * system.cpu.user\n\nAggregation(s) supported:\n * min\n * max\n * sum\n * avg\n * rate\n\nCatalog dimension filter differentiator:\n * mode (applicable filter values: 'system', 'user')\n\nCatalog dimension(s) supported:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id\n", "enum": [ - "system.cpu.time" + "system.cpu.utilization" ] }, "MetricSystemFilesystemUsage": { @@ -8113,18 +8883,18 @@ "system.network.io" ] }, - "MetricNginxHttpRequests": { + "MetricNginxHttpRequestCount": { "type": "string", - "description": "Total number of client requests received from clients.\n\nReplacement for depreciated variant(s):\n * nginx.http.request.count\n * plus.http.request.count\n\nAggregation(s) supported:\n * min\n * max\n * sum\n * avg\n * rate\n\nCatalog dimension(s) supported:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id\n * server_zone\n * location_zone\n", + "description": "The current number of client requests received from clients.\n\nReplacement for depreciated variant(s):\n * nginx.http.request.count\n * plus.http.request.count\n\nAggregation(s) supported:\n * min\n * max\n * sum\n * avg\n * rate\n\nCatalog dimension(s) supported:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id\n * server_zone\n * location_zone\n", "enum": [ - "nginx.http.requests" + "nginx.http.request.count" ] }, - "MetricNginxHttpResponseStatus": { + "MetricNginxHttpResponseCount": { "type": "string", - "description": "Number of responses for by status code range. A filter differentiator is needed for specific status range(s).\n\nReplacement for depreciated variant(s):\n * nginx.http.status.4xx\n * plus.http.status.4xx\n\nAggregation(s) supported:\n * min\n * max\n * sum\n * avg\n * rate\n\nCatalog dimension filter differentiator:\n * status_range (applicable filter values: '4xx', '5xx')\n\nCatalog dimension(s) supported:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id \n * server_zone\n * location_zone\n", + "description": "The current number of responses, grouped by status code range. A filter differentiator is needed for specific status range(s).\n\nReplacement for depreciated variant(s):\n * nginx.http.status.4xx\n * plus.http.status.4xx\n\nAggregation(s) supported:\n * min\n * max\n * sum\n * avg\n * rate\n\nCatalog dimension filter differentiator:\n * status_range (applicable filter values: '4xx', '5xx')\n\nCatalog dimension(s) supported:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id \n * server_zone\n * location_zone\n", "enum": [ - "nginx.http.response.status" + "nginx.http.response.count" ] }, "SettingsInstanceCleanup": { @@ -8322,15 +9092,15 @@ ] }, "NapPolicyEnforcementMode": { - "description": "The current enforcement mode of the NGINX App Protect policy, with the following possible values:\n* `blocking` - Any illegal or suspicious requests are logged and blocked.\n* `monitoring` - Any illegal or suspicious requests are logged but not blocked.\n", + "description": "The current enforcement mode of the NGINX App Protect policy, with the following possible values:\n* `blocking` - Any illegal or suspicious requests are logged and blocked.\n* `transparent` - Any illegal or suspicious requests are logged but not blocked.\n", "type": "string", "enum": [ "blocking", - "monitoring" + "transparent" ], "x-enum-varnames": [ "nap_enforcement_mode_blocking", - "nap_enforcement_mode_monitoring" + "nap_enforcement_mode_transparent" ] }, "NapDeploymentStatus": { @@ -8364,7 +9134,6 @@ "Version": { "description": "The version of the NGINX App Protect resource.", "type": "string", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", "example": "2023.12.06" }, "VersionsList": { @@ -8380,11 +9149,6 @@ "$ref": "#/components/schemas/Version" } } - }, - "example": { - "items": [ - "2023.12.06" - ] } }, "ThreatCampaignVersionsListResponse": { @@ -8400,27 +9164,36 @@ "$ref": "#/components/schemas/VersionsList" }, "NapPolicy": { - "description": "The JSON contents of the NGINX App Protect policy.", + "description": "The base64-encoded contents of the NGINX App Protect policy.", "type": "object", "required": [ "policy" ], "properties": { "policy": { - "description": "The NGINX App Protect policy configuration.", - "type": "object", - "minProperties": 1 + "type": "string", + "format": "base64", + "maxLength": 3145728 } } }, + "NapPolicyObject": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/NapPolicyMetadata" + }, + { + "$ref": "#/components/schemas/NapPolicyDeployments" + } + ] + }, "NapPolicyMetadata": { "description": "Summary information about NGINX App Protect policy.", "type": "object", "required": [ "object_id", "name", - "deployment_count", - "last_updated_by", "latest" ], "properties": { @@ -8431,74 +9204,38 @@ "description": "The name of the NGINX App Protect policy.", "type": "string" }, - "deployment_count": { - "description": "The number of NGINX One instances or config sync groups associated with the NGINX App Protect policy.", - "type": "integer" - }, - "last_updated_by": { - "description": "The NGINX One user who last modified the NGINX App Protect policy.", - "type": "string" - }, - "latest": { - "type": "object", - "required": [ - "enforcement_mode", - "deployed_on", - "version", - "created_on", - "last_updated_by" - ], - "properties": { - "enforcement_mode": { - "$ref": "#/components/schemas/NapPolicyEnforcementMode" - }, - "deployed_on": { - "description": "The date and time when the NGINX App Protect policy was last deployed.", - "type": "string", - "format": "date-time" - }, - "version": { - "description": "The latest version of the NGINX App Protect policy.", - "type": "string" - }, - "created_on": { - "description": "The date and time when the NGINX App Protect policy was created.", - "type": "string", - "format": "date-time" - } - } - }, "description": { "type": "string", "description": "Some detail on the NGINX App Protect policy." - } - }, - "example": { - "object_id": "pol_-uvR3F2TQGm18jnl7bpaGw", - "name": "test-policy", - "last_updated_by": "john.doe@example.com", - "deployment_count": 5, - "decription": "test policy", + }, "latest": { - "enforcement_mode": "blocking", - "deployed_on": "2023-12-06T22:37:24.120114Z", - "version": "2023-12-06 22:37:24", - "created_on": "2023-12-06T22:37:24.120114Z" + "$ref": "#/components/schemas/NapPolicyVersionMetadata" } } }, - "NapPolicyResponse": { - "description": "Summary information about NGINX App Protect policy.", + "NapPolicyListItem": { + "type": "object", "allOf": [ { "$ref": "#/components/schemas/NapPolicyMetadata" }, { - "$ref": "#/components/schemas/NapPolicy" + "type": "object", + "required": [ + "deployments" + ], + "properties": { + "deployments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NapPolicyDeployment" + } + } + } } ] }, - "NapPoliciesListResponse": { + "NapPolicyListResponse": { "description": "List of all NGINX App Protect policies.", "allOf": [ { @@ -8515,7 +9252,7 @@ "description": "An array of NGINX App Protect policy objects.", "type": "array", "items": { - "$ref": "#/components/schemas/NapPolicyMetadata" + "$ref": "#/components/schemas/NapPolicyListItem" } } }, @@ -8524,78 +9261,197 @@ { "object_id": "pol_-uvR3F2TQGm18jnl7bpaGw", "name": "test-policy", - "decription": "test policy", - "created_on": "2023-12-06T22:37:24.120114Z", - "latest_version": "2023.12.06", - "last_updated_by": "john.doe@example.com", - "enforcement_mode": "blocking", - "last_deployed": "2023-12-06T22:37:24.120114Z" + "description": "test policy", + "deployments": [ + { + "publication_object_id": "pub_-uvR3F2TQGm18jnl7bpaGw", + "target_name": "test-instance", + "target_type": "instance", + "target_object_id": "inst_-uvR3F2TQGm18jnl7bpaGw", + "status": "deployed", + "enforcement_mode": "blocking", + "policy_version": "2023-12-06 22:37:24", + "policy_version_object_id": "pv_-abc3F2TQGm18jnl7bpaGw", + "deployed_on": "2023-12-06T22:37:24.120114Z" + } + ], + "latest": { + "object_id": "pv_-uvR3F2TQGm18jnl7bpaGw", + "version": "2023-12-06 22:37:24", + "created_on": "2023-12-06T22:37:24.120114Z", + "deployment_status": "deployed", + "enforcement_mode": "blocking" + } } ] } } ] }, - "NapPolicyDeploymentMetadata": { + "NapPolicyVersionDeployments": { + "type": "object", + "properties": { + "deployments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NapPolicyVersionDeployment" + } + } + } + }, + "NapPolicyVersionDeployment": { + "description": "detailed information about a NGINX App Protect policy version deployment.", "type": "object", "required": [ - "object_id", - "enforcement_mode", - "name", - "type", + "publication_object_id", + "target_object_id", + "target_name", + "target_type", "status", - "policy_version", - "threat_campaign_version", - "attack_signature_version", - "bot_signature_version" + "deployed_on" ], "properties": { - "object_id": { + "publication_object_id": { "$ref": "#/components/schemas/PublicationObjectID" }, - "enforcement_mode": { - "$ref": "#/components/schemas/NapPolicyEnforcementMode" + "target_object_id": { + "$ref": "#/components/schemas/ObjectID" }, - "name": { + "target_name": { "description": "The name of the NGINX One instance or config sync group.", "type": "string" }, - "type": { + "target_type": { "$ref": "#/components/schemas/NapDeploymentType" }, "status": { "$ref": "#/components/schemas/NapDeploymentStatus" }, - "policy_version": { - "description": "The version associated with the NGINX App Protect policy.", - "type": "string" - }, "deployed_on": { "description": "The date and time when the NGINX App Protect policy was deployed.", "type": "string", "format": "date-time" + } + }, + "example": { + "publication_object_id": "pub_-uvR3F2TQGm18jnl7bpaGw", + "target_name": "test-instance", + "target_type": "instance", + "target_object_id": "inst_-uvR3F2TQGm18jnl7bpaGw", + "status": "deployed", + "deployed_on": "2023-12-06T22:37:24.120114Z" + } + }, + "NapPolicyDeployments": { + "type": "object", + "properties": { + "deployments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NapPolicyDeployment" + } + } + } + }, + "NapPolicyDeployment": { + "description": "detailed information about a NGINX App Protect policy deployment.", + "type": "object", + "required": [ + "publication_object_id", + "target_object_id", + "target_name", + "target_type", + "enforcement_mode", + "status", + "policy_version", + "policy_version_object_id", + "deployed_on" + ], + "allOf": [ + { + "$ref": "#/components/schemas/NapPolicyVersionDeployment" }, - "threat_campaign_version": { - "$ref": "#/components/schemas/Version" - }, - "attack_signature_version": { - "$ref": "#/components/schemas/Version" + { + "type": "object", + "required": [ + "enforcement_mode", + "policy_version", + "policy_version_object_id" + ], + "properties": { + "enforcement_mode": { + "$ref": "#/components/schemas/NapPolicyEnforcementMode" + }, + "policy_version": { + "description": "The version associated with the NGINX App Protect policy.", + "type": "string" + }, + "policy_version_object_id": { + "$ref": "#/components/schemas/NapPolicyVersionObjectID" + } + } + } + ], + "example": { + "publication_object_id": "pub_-uvR3F2TQGm18jnl7bpaGw", + "target_name": "test-instance", + "target_type": "instance", + "target_object_id": "inst_-uvR3F2TQGm18jnl7bpaGw", + "status": "deployed", + "deployed_on": "2023-12-06T22:37:24.120114Z", + "enforcement_mode": "blocking", + "policy_version": "2023-12-06 22:37:24", + "policy_version_object_id": "pv_-abc3F2TQGm18jnl7bpaGw" + } + }, + "NapPolicyDeploymentDetails": { + "type": "object", + "required": [ + "publication_object_id", + "target_object_id", + "target_name", + "target_type", + "enforcement_mode", + "status", + "policy_version", + "policy_version_object_id", + "deployed_on", + "threat_campaign_version", + "attack_signature_version", + "bot_signature_version" + ], + "allOf": [ + { + "$ref": "#/components/schemas/NapPolicyDeployment" }, - "bot_sigature_version": { - "$ref": "#/components/schemas/Version" + { + "type": "object", + "properties": { + "threat_campaign_version": { + "$ref": "#/components/schemas/Version" + }, + "attack_signature_version": { + "$ref": "#/components/schemas/Version" + }, + "bot_signature_version": { + "$ref": "#/components/schemas/Version" + } + } } - }, + ], "example": { - "object_id": "pub_-uvR3F2TQGm18jnl7bpaGw", - "name": "test-instance", - "type": "instance", + "publication_object_id": "pub_-uvR3F2TQGm18jnl7bpaGw", + "target_name": "test-instance", + "target_type": "instance", + "target_object_id": "inst_-uvR3F2TQGm18jnl7bpaGw", "status": "deployed", "policy_version": "2023-12-06 22:37:24", + "policy_version_object_id": "pv_-abc3F2TQGm18jnl7bpaGw", "deployed_on": "2023-12-06T22:37:24.120114Z", "enforcement_mode": "blocking", "threat_campaign_version": "2023.12.06", "attack_signature_version": "2023.12.06", - "bot_sigature_version": "2023.12.06" + "bot_signature_version": "2023.12.06" } }, "NapPolicyDeploymentsListResponse": { @@ -8614,23 +9470,25 @@ "description": "An array of NGINX App Protect deployments.", "type": "array", "items": { - "$ref": "#/components/schemas/NapPolicyDeploymentMetadata" + "$ref": "#/components/schemas/NapPolicyDeploymentDetails" } } }, "example": { "items": [ { - "object_id": "pub_-uvR3F2TQGm18jnl7bpaGw", - "name": "test-instance", - "type": "instance", + "publication_object_id": "pub_-uvR3F2TQGm18jnl7bpaGw", + "target_name": "test-instance", + "target_type": "instance", + "target_object_id": "inst_-uvR3F2TQGm18jnl7bpaGw", "status": "deployed", "policy_version": "2023-12-06 22:37:24", + "policy_version_object_id": "pv_-abc3F2TQGm18jnl7bpaGw", "deployed_on": "2023-12-06T22:37:24.120114Z", "enforcement_mode": "blocking", "threat_campaign_version": "2023.12.06", "attack_signature_version": "2023.12.06", - "bot_sigature_version": "2023.12.06" + "bot_signature_version": "2023.12.06" } ] } @@ -8639,68 +9497,73 @@ }, "NapPolicyVersionMetadata": { "type": "object", + "description": "Summary information about the specific NGINX App Protect policy version.", "required": [ "object_id", + "version", "enforcement_mode", - "deployment_status", - "instance_count", - "config_sync_group_count", - "created_on", - "created_by", - "latest" + "created_on" ], "properties": { "object_id": { "$ref": "#/components/schemas/NapPolicyVersionObjectID" }, + "version": { + "$ref": "#/components/schemas/Version" + }, "enforcement_mode": { "$ref": "#/components/schemas/NapPolicyEnforcementMode" }, - "deployment_status": { - "$ref": "#/components/schemas/NapDeploymentStatus" - }, - "instance_count": { - "description": "The number of NGINX One instances associated with the NGINX App Protect policy version", - "type": "integer" - }, - "config_sync_group_count": { - "description": "The number of NGINX One config sync groups associated with the NGINX App Protect policy version", - "type": "integer" - }, "created_on": { "description": "The date and time when the NGINX App Protect policy version was created.", "type": "string", "format": "date-time" + } + } + }, + "NapPolicyVersionDetails": { + "description": "Detailed information about NGINX App Protect policy version.", + "type": "object", + "required": [ + "policy", + "object_id", + "version", + "enforcement_mode", + "created_on" + ], + "allOf": [ + { + "$ref": "#/components/schemas/NapPolicyVersionMetadata" }, - "created_by": { - "description": "The NGINX One user who created the NGINX App Protect policy.", - "type": "string" + { + "$ref": "#/components/schemas/NapPolicy" }, - "latest": { - "description": "Indicates whether the NGINX App Protect policy version is latest. Default (`false`) returns the current policy. \nWhen set to `true`, returns the latest policy.\n", - "type": "boolean", - "default": false + { + "$ref": "#/components/schemas/NapPolicyVersionDeployments" } - }, - "example": { - "object_id": "pv_-uvR3F2TQGm18jnl7bpaGw", - "created_on": "2023-12-06T22:37:24.120114Z", - "created_by": "john.doe@example.com", - "deployment_status": "deployed", - "enforcement_mode": "blocking", - "instance_count": 10, - "config_sync_group_count": 15, - "latest": false - } + ] }, - "NapPolicyVersionResponse": { + "NapPolicyVersionObject": { "description": "Summary information about NGINX App Protect policy version.", "allOf": [ { "$ref": "#/components/schemas/NapPolicyVersionMetadata" }, { - "$ref": "#/components/schemas/NapPolicy" + "$ref": "#/components/schemas/NapPolicyVersionDeployments" + }, + { + "type": "object", + "required": [ + "latest" + ], + "properties": { + "latest": { + "description": "Indicates whether the NGINX App Protect policy version is latest. Default (`false`) returns the current policy. \nWhen set to `true`, returns the latest policy.\n", + "type": "boolean", + "default": false + } + } } ] }, @@ -8720,20 +9583,17 @@ "description": "An array of NGINX App Protect version objects.", "type": "array", "items": { - "$ref": "#/components/schemas/NapPolicyVersionMetadata" + "$ref": "#/components/schemas/NapPolicyVersionObject" } } }, "example": { "items": [ { - "object_id": "appv_-uvR3F2TQGm18jnl7bpaGw", + "version": "2023-12-06 22:37:24", + "object_id": "pv_-uvR3F2TQGm18jnl7bpaGw", "created_on": "2023-12-06T22:37:24.120114Z", - "created_by": "john.doe@example.com", - "deployment_status": "deployed", "enforcement_mode": "blocking", - "instance_count": 10, - "config_sync_group_count": 15, "latest": false } ] @@ -8759,144 +9619,482 @@ "$ref": "#/components/schemas/NapLogProfileMetadata" } } - }, - "example": { - "items": [ - { - "name": "test-log-profile" - }, - { - "object_id": "lp_-uvR3F2TQGm18jnl7bpaGw" + } + } + ] + }, + "NapLogProfileResponse": { + "$ref": "#/components/schemas/NapLogProfileMetadata" + }, + "NapLogProfileMetadata": { + "type": "object", + "required": [ + "name", + "object_id" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the NGINX App Protect log profile." + }, + "object_id": { + "$ref": "#/components/schemas/NapLogProfileObjectID" + }, + "description": { + "description": "Optional field to describe the NGINX App Protect log profile.", + "type": "string", + "minLength": 5, + "maxLength": 256 + } + } + }, + "NapGlobalSettingsListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginationResponse" + }, + { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "description": "An array of NGINX App Protect global settings.", + "type": "array", + "items": { + "$ref": "#/components/schemas/NapGlobalSettingsMetadata" } - ] + } } } - ] + ] + }, + "NapGlobalSettingsResponse": { + "$ref": "#/components/schemas/NapGlobalSettingsMetadata" + }, + "NapGlobalSettingsMetadata": { + "type": "object", + "required": [ + "name", + "object_id" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the NGINX App Protect global settings object." + }, + "description": { + "description": "Optional field to describe the NGINX App Protect global setting object.", + "type": "string", + "minLength": 5, + "maxLength": 256 + }, + "object_id": { + "$ref": "#/components/schemas/NapGlobalSettingsObjectID" + } + } + }, + "NapPolicyObjectID": { + "description": "A globally unique identifier for the App Protect policy.", + "type": "string", + "format": "object_id", + "pattern": "^pol_.*", + "x-go-type": "objects.ID", + "x-go-type-import": { + "name": "objects", + "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + } + }, + "NapPolicyVersionObjectID": { + "description": "A globally unique identifier for the App Protect policy version.", + "type": "string", + "format": "object_id", + "pattern": "^pv_.*", + "x-go-type": "objects.ID", + "x-go-type-import": { + "name": "objects", + "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + } + }, + "NapLogProfileObjectID": { + "description": "A globally unique identifier for the App Protect log profile.", + "type": "string", + "format": "object_id", + "pattern": "^lp_.*", + "x-go-type": "objects.ID", + "x-go-type-import": { + "name": "objects", + "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + } + }, + "NapGlobalSettingsObjectID": { + "description": "A globally unique identifier for the App Protect global settings object.", + "type": "string", + "format": "object_id", + "pattern": "^gs_.*", + "x-go-type": "objects.ID", + "x-go-type-import": { + "name": "objects", + "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + } + }, + "CloudIdentity": { + "type": "object", + "required": [ + "google_identity" + ], + "minProperties": 1, + "maxProperties": 1, + "properties": { + "google_identity": { + "$ref": "#/components/schemas/GoogleIdentity" + } + } + }, + "GoogleIdentity": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "example": "253092013665251357076" + } + } + }, + "CloudUserCreateRequest": { + "type": "object", + "description": "Request structure for creating a new cloud user.", + "required": [ + "cloud_identity" + ], + "properties": { + "cloud_identity": { + "$ref": "#/components/schemas/CloudIdentity" + } + } + }, + "CloudAccountObjectID": { + "description": "A globally unique identifier for the cloud account.", + "type": "string", + "format": "object_id", + "pattern": "^acc_.*", + "x-go-type": "objects.ID", + "x-go-type-import": { + "name": "objects", + "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + } + }, + "CloudUserObjectID": { + "description": "A globally unique identifier for the cloud user.", + "type": "string", + "format": "object_id", + "pattern": "^usr_.*", + "x-go-type": "objects.ID", + "x-go-type-import": { + "name": "objects", + "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + } + }, + "CloudUser": { + "type": "object", + "required": [ + "object_id", + "cloud_identity" + ], + "properties": { + "object_id": { + "$ref": "#/components/schemas/CloudUserObjectID" + }, + "cloud_identity": { + "$ref": "#/components/schemas/CloudIdentity" + } + } + }, + "AuthGoogleCallbackResponse": { + "type": "object", + "required": [ + "access_token" + ], + "properties": { + "access_token": { + "type": "string", + "description": "The signed access token to be used to authenticate API requests. This token should be treated as a \"secret\".\n" + } + } + }, + "SignupWithGoogleRequest": { + "required": [ + "account_id", + "google_user_id" + ], + "properties": { + "account_id": { + "type": "string", + "description": "Google marketplace account id" + }, + "google_user_id": { + "type": "string", + "description": "Google user identity of the user completing signup." + } + } + }, + "SignupWithGoogleResponse": { + "type": "object", + "required": [ + "account_id", + "user_id" + ], + "properties": { + "account_id": { + "$ref": "#/components/schemas/CloudAccountObjectID" + }, + "user_id": { + "$ref": "#/components/schemas/CloudUserObjectID" + } + } + }, + "DeploymentObjectID": { + "type": "string", + "description": "A globally unique identifier for the deployment.", + "format": "object_id", + "pattern": "^depl_.*", + "x-go-type": "objects.ID", + "x-go-type-import": { + "name": "objects", + "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + } + }, + "DeploymentAccountID": { + "type": "string", + "description": "Account ID of deployment.", + "format": "object_id", + "pattern": "^acc_.*", + "x-go-type": "objects.ID", + "x-go-type-import": { + "name": "objects", + "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + } + }, + "DeploymentName": { + "type": "string", + "description": "Name of deployment.", + "minLength": 3, + "maxLength": 30, + "pattern": "^[a-z][a-z0-9-]*[a-z0-9]$" + }, + "DeploymentDescription": { + "type": "string", + "description": "Description of deployment.", + "maxLength": 256 + }, + "DeploymentCloudName": { + "type": "string", + "description": "Name of the cloud where deployment resources are provisioned.", + "enum": [ + "google" + ] + }, + "DeploymentCloudInfo": { + "type": "object", + "description": "Cloud-specific deployment info.", + "oneOf": [ + { + "$ref": "#/components/schemas/GoogleDeploymentInfo" + } + ] + }, + "GoogleDeploymentInfo": { + "type": "object", + "description": "Google deployment info.", + "required": [ + "region", + "network_attachment" + ], + "properties": { + "region": { + "$ref": "#/components/schemas/GoogleRegion" + }, + "network_attachment": { + "$ref": "#/components/schemas/GoogleNetworkAttachment" + }, + "service_attachment": { + "$ref": "#/components/schemas/GoogleServiceAttachment" + } + } }, - "NapLogProfileResponse": { - "$ref": "#/components/schemas/NapLogProfileMetadata" + "GoogleResourceName": { + "type": "string", + "minLength": 1, + "maxLength": 63, + "pattern": "^[a-z]([-a-z0-9]*[a-z0-9])?" }, - "NapLogProfileMetadata": { + "GoogleRegion": { + "description": "Google region.", + "$ref": "#/components/schemas/GoogleResourceName" + }, + "GoogleNetworkAttachment": { + "type": "string", + "description": "Google network attachment.", + "pattern": "projects/[a-z]([-a-z0-9]*[a-z0-9])?/regions/[a-z]([-a-z0-9]*[a-z0-9])?/networkAttachments/[a-z]([-a-z0-9]*[a-z0-9])?" + }, + "GoogleServiceAttachment": { + "type": "string", + "description": "Google service attachment.", + "pattern": "projects/[a-z]([-a-z0-9]*[a-z0-9])?/regions/[a-z]([-a-z0-9]*[a-z0-9])?/serviceAttachments/[a-z]([-a-z0-9]*[a-z0-9])?" + }, + "Deployment": { "type": "object", + "description": "Deployment specification.", "required": [ + "id", + "account_id", "name", - "object_id" + "description", + "cloud", + "cloud_info", + "status", + "created_at", + "modified_at" ], "properties": { + "id": { + "$ref": "#/components/schemas/DeploymentObjectID" + }, + "account_id": { + "$ref": "#/components/schemas/DeploymentAccountID" + }, "name": { + "$ref": "#/components/schemas/DeploymentName" + }, + "description": { + "$ref": "#/components/schemas/DeploymentDescription" + }, + "cloud": { + "$ref": "#/components/schemas/DeploymentCloudName" + }, + "cloud_info": { + "$ref": "#/components/schemas/DeploymentCloudInfo" + }, + "status": { + "$ref": "#/components/schemas/DeploymentStatus" + }, + "created_at": { "type": "string", - "description": "The name of the NGINX App Protect log profile." + "description": "Datetime when request to create deployment was received.", + "format": "date-time" }, - "object_id": { - "$ref": "#/components/schemas/NapLogProfileObjectID" + "modified_at": { + "type": "string", + "description": "Datetime when deployment was last modified.", + "format": "date-time" }, - "description": { - "description": "Optional field to describe the NGINX App Protect log profile.", + "deleted_at": { "type": "string", - "minLength": 5, - "maxLength": 256 + "description": "Datetime when request to delete deployment was received.", + "format": "date-time" } } }, - "NapGlobalSettingsListResponse": { - "allOf": [ - { - "$ref": "#/components/schemas/PaginationResponse" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "description": "An array of NGINX App Protect global settings.", - "type": "array", - "items": { - "$ref": "#/components/schemas/NapGlobalSettingsMetadata" - } - } - }, - "example": { - "items": [ - { - "name": "test-global-settings" - }, - { - "object_id": "gs_-uvR3F2TQGm18jnl7bpaGw" - } - ] - } + "DeploymentStatus": { + "type": "object", + "description": "Deployment status info.", + "required": [ + "provisioning_state" + ], + "properties": { + "provisioning_state": { + "$ref": "#/components/schemas/DeploymentProvisioningState" } - ] - }, - "NapGlobalSettingsResponse": { - "$ref": "#/components/schemas/NapGlobalSettingsMetadata" + } }, - "NapGlobalSettingsMetadata": { + "DeploymentProvisioningState": { "type": "object", + "description": "Deployment provisioning state info.", "required": [ - "name", - "object_id" + "state", + "modified_at" ], "properties": { - "name": { + "state": { "type": "string", - "description": "The name of the NGINX App Protect global settings object." + "description": "Provisioning state name/value.", + "enum": [ + "deleting", + "failed", + "pending", + "ready" + ] }, - "description": { - "description": "Optional field to describe the NGINX App Protect global setting object.", + "details": { "type": "string", - "minLength": 5, + "description": "Provisioning state details.", "maxLength": 256 }, - "object_id": { - "$ref": "#/components/schemas/NapGlobalSettingsObjectID" + "modified_at": { + "type": "string", + "description": "Datetime of last state change.", + "format": "date-time" } } }, - "NapPolicyObjectID": { - "description": "A globally unique identifier for the App Protect policy.", - "type": "string", - "format": "object_id", - "pattern": "^pol_.*", - "x-go-type": "objects.ID", - "x-go-type-import": { - "name": "objects", - "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" - } - }, - "NapPolicyVersionObjectID": { - "description": "A globally unique identifier for the App Protect policy version.", - "type": "string", - "format": "object_id", - "pattern": "^pv_.*", - "x-go-type": "objects.ID", - "x-go-type-import": { - "name": "objects", - "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + "DeploymentListResponse": { + "type": "object", + "description": "List of deployments.", + "required": [ + "count", + "items" + ], + "properties": { + "count": { + "description": "The total number of deployments returned.", + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Deployment" + } + } } }, - "NapLogProfileObjectID": { - "description": "A globally unique identifier for the App Protect log profile.", - "type": "string", - "format": "object_id", - "pattern": "^lp_.*", - "x-go-type": "objects.ID", - "x-go-type-import": { - "name": "objects", - "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + "DeploymentCreateRequest": { + "type": "object", + "description": "Request spec for creating a deployment.", + "required": [ + "name", + "cloud", + "cloud_info" + ], + "properties": { + "name": { + "$ref": "#/components/schemas/DeploymentName" + }, + "description": { + "$ref": "#/components/schemas/DeploymentDescription" + }, + "cloud": { + "$ref": "#/components/schemas/DeploymentCloudName" + }, + "cloud_info": { + "$ref": "#/components/schemas/DeploymentCloudInfo" + } } }, - "NapGlobalSettingsObjectID": { - "description": "A globally unique identifier for the App Protect global settings object.", - "type": "string", - "format": "object_id", - "pattern": "^gs_.*", - "x-go-type": "objects.ID", - "x-go-type-import": { - "name": "objects", - "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects" + "DeploymentUpdateRequest": { + "type": "object", + "description": "Request spec for updating a deployment.", + "properties": { + "name": { + "$ref": "#/components/schemas/DeploymentName" + }, + "description": { + "$ref": "#/components/schemas/DeploymentDescription" + } } } }, @@ -8953,6 +10151,173 @@ "object_id": "key_wN3IhLCmR3qmwybG_6ptEg", "instances_count": 3 } + }, + "CloudUserResponse": { + "value": { + "cloud_identity": { + "google_identity": { + "id": "253092013665251357076" + } + } + } + }, + "DeploymentListResponse": { + "value": { + "count": 2, + "items": [ + { + "id": "depl_6zYc64JKR0uxnoEcLH1gGA", + "account_id": "acc_FsFgfeDtScOjGbQJDaVNiQ", + "name": "tst-foo", + "description": "", + "cloud": "google", + "cloud_info": { + "region": "us-east1", + "network_attachment": "projects/foo/regions/us-east1/networkAttachments/foo", + "service_attachment": "projects/foo/regions/us-east1/serviceAttachments/foo" + }, + "status": { + "provisioning_state": { + "state": "ready", + "details": "", + "modified_at": "2025-03-31T10:05:00Z" + } + }, + "created_at": "2025-03-31T10:00:00Z", + "modified_at": "2025-03-31T10:05:00Z" + }, + { + "id": "depl_DrRnpntTRpGOxaroQ6aOFg", + "account_id": "acc_FsFgfeDtScOjGbQJDaVNiQ", + "name": "tst-bar", + "description": "test w/ network attachment from project bar", + "cloud": "google", + "cloud_info": { + "region": "eu-west-1", + "network_attachment": "projects/bar/regions/us-east1/networkAttachments/bar" + }, + "status": { + "provisioning_state": { + "state": "failed", + "details": "network attachment 'bar' not found", + "modified_at": "2025-03-31T11:03:00Z" + } + }, + "created_at": "2025-03-31T11:00:00Z", + "modified_at": "2025-03-31T11:03:00Z" + } + ] + } + }, + "DeploymentCreateRequest": { + "value": { + "name": "tst-foo", + "description": "", + "cloud": "google", + "cloud_info": { + "region": "us-east1", + "network_attachment": "projects/foo/regions/us-east1/networkAttachments/foo" + } + } + }, + "DeploymentCreateResponse": { + "value": { + "id": "depl_6zYc64JKR0uxnoEcLH1gGA", + "account_id": "acc_FsFgfeDtScOjGbQJDaVNiQ", + "name": "tst-foo", + "description": "", + "cloud": "google", + "cloud_info": { + "region": "us-east1", + "network_attachment": "projects/foo/regions/us-east1/networkAttachments/foo", + "service_attachment": "projects/foo/regions/us-east1/serviceAttachments/foo" + }, + "status": { + "provisioning_state": { + "state": "pending", + "details": "", + "modified_at": "2025-03-31T10:05:00Z" + } + }, + "created_at": "2025-03-31T10:00:00Z", + "modified_at": "2025-03-31T10:05:00Z" + } + }, + "DeploymentGetResponse": { + "value": { + "id": "depl_6zYc64JKR0uxnoEcLH1gGA", + "account_id": "acc_FsFgfeDtScOjGbQJDaVNiQ", + "name": "tst-foo", + "description": "", + "cloud": "google", + "cloud_info": { + "region": "us-east1", + "network_attachment": "projects/foo/regions/us-east1/networkAttachments/foo", + "service_attachment": "projects/foo/regions/us-east1/serviceAttachments/foo" + }, + "status": { + "provisioning_state": { + "state": "ready", + "details": "", + "modified_at": "2025-03-31T10:05:00Z" + } + }, + "created_at": "2025-03-31T10:00:00Z", + "modified_at": "2025-03-31T10:05:00Z" + } + }, + "DeploymentUpdateRequest": { + "value": { + "name": "poc-foo", + "description": "test deployment for project foo" + } + }, + "DeploymentUpdateResponse": { + "value": { + "id": "depl_6zYc64JKR0uxnoEcLH1gGA", + "account_id": "acc_FsFgfeDtScOjGbQJDaVNiQ", + "name": "poc-foo", + "description": "test deployment for project foo", + "cloud": "google", + "cloud_info": { + "region": "us-east1", + "network_attachment": "projects/foo/regions/us-east1/networkAttachments/foo", + "service_attachment": "projects/foo/regions/us-east1/serviceAttachments/foo" + }, + "status": { + "provisioning_state": { + "state": "ready", + "details": "", + "modified_at": "2025-03-31T10:05:00Z" + } + }, + "created_at": "2025-03-31T10:00:00Z", + "modified_at": "2025-03-31T10:05:00Z" + } + }, + "DeploymentDeleteResponse": { + "value": { + "id": "depl_6zYc64JKR0uxnoEcLH1gGA", + "account_id": "acc_FsFgfeDtScOjGbQJDaVNiQ", + "name": "poc-foo", + "description": "test deployment for project foo", + "cloud": "google", + "cloud_info": { + "region": "us-east1", + "network_attachment": "projects/foo/regions/us-east1/networkAttachments/foo", + "service_attachment": "projects/foo/regions/us-east1/serviceAttachments/foo" + }, + "status": { + "provisioning_state": { + "state": "deleting", + "details": "", + "modified_at": "2025-03-31T10:15:00Z" + } + }, + "created_at": "2025-03-31T10:00:00Z", + "modified_at": "2025-03-31T10:05:00Z", + "deleted_at": "2025-03-31T10:15:00Z" + } } }, "responses": { @@ -8975,6 +10340,36 @@ } } } + }, + "Unauthorized": { + "description": "Client is not authorized to perform the requested operation.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "NotFound": { + "description": "Requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "Conflict": { + "description": "Requested operation cannot be performed at this time.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } }, "securitySchemes": { @@ -9014,6 +10409,20 @@ "tags": [ "Settings" ] + }, + { + "name": "NAAS Marketplace", + "tags": [ + "Authorization", + "Signup", + "User" + ] + }, + { + "name": "Manage NAAS deployments", + "tags": [ + "Deployments" + ] } ] } \ No newline at end of file