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