diff --git a/content/controller/api/reference/ctlr-adc-api.md b/content/controller/api/reference/ctlr-adc-api.md index bafb157a5..163007c8c 100644 --- a/content/controller/api/reference/ctlr-adc-api.md +++ b/content/controller/api/reference/ctlr-adc-api.md @@ -4,9 +4,12 @@ description: Represents the state of the F5 NGINX Controller Application Deliver docs: DOCS-1280 type: - reference +type: redoc +tags: + - api title: ADC API toc: false weight: 300 --- -{{< openapi spec="/controller/api/reference/ctlr-adc-openapi.json" >}} +{{< openapi spec="./nginx-controller/api/ctlr-adc-openapi.json" >}} diff --git a/content/controller/api/reference/ctlr-adc-openapi.json b/content/controller/api/reference/ctlr-adc-openapi.json index ec92b7d55..a33c146bd 100644 --- a/content/controller/api/reference/ctlr-adc-openapi.json +++ b/content/controller/api/reference/ctlr-adc-openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.0", + "openapi": "3.0.3", "info":{ "title": "NGINX Controller Application Delivery REST API", "version": "v1", @@ -13362,4 +13362,4 @@ } } } -} \ No newline at end of file +} diff --git a/content/controller/api/reference/ctlr-analytics-api.md b/content/controller/api/reference/ctlr-analytics-api.md index a1aa3e3cc..7fb7826e8 100644 --- a/content/controller/api/reference/ctlr-analytics-api.md +++ b/content/controller/api/reference/ctlr-analytics-api.md @@ -3,9 +3,12 @@ description: Represents the state of the F5 NGINX Controller Analytics REST API. docs: DOCS-1279 type: - reference +type: redoc +tags: + - api title: Analytics API toc: false weight: 200 --- -{{< openapi spec="/controller/api/reference/ctlr-analytics-openapi.json" >}} +{{< openapi spec="./nginx-controller/api/ctlr-analytics-openapi.json" >}} diff --git a/content/controller/api/reference/ctlr-analytics-openapi.json b/content/controller/api/reference/ctlr-analytics-openapi.json index f94f7d8c0..10381247a 100644 --- a/content/controller/api/reference/ctlr-analytics-openapi.json +++ b/content/controller/api/reference/ctlr-analytics-openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.0", + "openapi": "3.0.3", "info":{ "title": "NGINX Controller Analytics REST API", "version": "v1", @@ -2458,4 +2458,4 @@ } } } -} \ No newline at end of file +} diff --git a/content/controller/api/reference/ctlr-apim-api.md b/content/controller/api/reference/ctlr-apim-api.md index ad2a55f8a..89feba469 100644 --- a/content/controller/api/reference/ctlr-apim-api.md +++ b/content/controller/api/reference/ctlr-apim-api.md @@ -3,9 +3,12 @@ description: Represents the state of the F5 NGINX Controller API Management REST docs: DOCS-1281 type: - reference +type: redoc +tags: + - api title: APIM API toc: false weight: 400 --- -{{< openapi spec="/controller/api/reference/ctlr-apim-openapi.json" >}} +{{< openapi spec="./nginx-controller/api/ctlr-apim-openapi.json" >}} diff --git a/content/controller/api/reference/ctlr-apim-openapi.json b/content/controller/api/reference/ctlr-apim-openapi.json index 55c6e62a8..d9deeb66e 100644 --- a/content/controller/api/reference/ctlr-apim-openapi.json +++ b/content/controller/api/reference/ctlr-apim-openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.0", + "openapi": "3.0.3", "info":{ "title": "NGINX Controller API Management REST API", "version": "v1", @@ -12544,4 +12544,4 @@ } } } -} \ No newline at end of file +} diff --git a/content/controller/api/reference/ctlr-platform-api.md b/content/controller/api/reference/ctlr-platform-api.md index b5b8e444a..77a9d54d2 100644 --- a/content/controller/api/reference/ctlr-platform-api.md +++ b/content/controller/api/reference/ctlr-platform-api.md @@ -3,9 +3,12 @@ description: Represents the state of the F5 NGINX Controller Platform REST API. docs: DOCS-1278 type: - reference +type: redoc +tags: + - api title: Platform API toc: false weight: 100 --- -{{< openapi spec="/controller/api/reference/ctlr-platform-openapi.json" >}} +{{< openapi spec="./nginx-controller/api/ctlr-platform-openapi.json" >}} diff --git a/content/controller/api/reference/ctlr-platform-openapi.json b/content/controller/api/reference/ctlr-platform-openapi.json index 53662a918..01c7d6bb7 100644 --- a/content/controller/api/reference/ctlr-platform-openapi.json +++ b/content/controller/api/reference/ctlr-platform-openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.0", + "openapi": "3.0.3", "info":{ "title": "NGINX Controller Platform REST API", "version": "v1", diff --git a/static/controller/api/ctlr-adc-openapi.json b/static/controller/api/ctlr-adc-openapi.json new file mode 100644 index 000000000..a33c146bd --- /dev/null +++ b/static/controller/api/ctlr-adc-openapi.json @@ -0,0 +1,13365 @@ +{ + "openapi": "3.0.3", + "info":{ + "title": "NGINX Controller Application Delivery REST API", + "version": "v1", + "description": "Use the NGINX Controller Application Delivery module to configure, secure, monitor, and troubleshoot load balancing for your applications." + }, + "servers": [ + { + "description": "NGINX Controller API", + "url": "https://{{CONTROLLER_FQDN}}/api/v1" + }], + "tags": [ + { + "name": "Instances", + "description": "Use the Instance API to manage NGINX Controller Instance resources." + }, + { + "name": "Instance Groups", + "description": "Use the Instance Groups API to manage a set of instances that can be used for scaling and high availability. The Instance Groups API is a beta feature and is not recommended for use in production environments." + }, + { + "name": "Instance Templates", + "description": "Use the Instance Templates API to manage templates that can be used to deploy new NGINX Plus instances." + }, + { + "name": "Locations", + "description": "Use the Locations API to manage the deployment locations for NGINX Controller." + }, + { + "name": "Integrations", + "description": "Use the Integrations API to manage integrated cloud provider accounts." + }, + { + "name": "Environments", + "description": "Use the Environments API to manage your Application Environments." + }, + { + "name": "Certs", + "description": "Use the Certs API to manage the certificates used to secure your App traffic." + }, + { + "name": "Gateways", + "description": "Use the Gateways API to manage Gateway resources." + }, + { + "name": "Apps", + "description": "Use the Apps API to manage App resources." + }, + { + "name": "Components", + "description": "Use the Components API to define child components (for example, microservices) for your Apps." + }, + { + "name": "API Definitions", + "description": "Use the API Definitions API to manage your APIs by using the NGINX Controller API Management module." + }, + { + "name": "DevPortals", + "description": "Use the DevPortals API to manage DevPortals resources." + }, + { + "name": "Identity Providers", + "description": "Use the Identity Provider API to manage Identity providers in the API-M Credential Management partition." + }, + { + "name": "Published APIs", + "description": "Use the Published APIs API to manage your APIs by using the API Management module." + }, + { + "name": "Error Sets", + "description": "Use the Error Sets API to view the default predefined Error Sets." + }, + { + "name": "Services", + "description": "Use the Services API to request a metadata list of a desired resource within a single environment or across all environments.\nSupported resources:\n - published-apis\n" + }, + { + "name": "Strategies", + "description": "Manage Security Strategies for your Apps and APIs. The current supported strategy is an NGINX App Protect Strategy (beta)." + }, + { + "name": "Policies", + "description": "Manage Security Policies for your Apps and APIs. The current supported policy is an NGINX App Protect Policy (beta)." + } + ], + "paths": { + "/infrastructure/instance-groups": { + "get": { + "tags": [ + "Instance Groups" + ], + "summary": "List Instance Groups", + "description": "Returns an unfiltered list of all Instance Group resources.", + "operationId": "listInstanceGroups", + "responses": { + "200": { + "description": "Successfully retieved a list of all the configured Instance Groups.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceGroupsResponse" + }, + "example": { + "value": { + "items": [ + { + "currentStatus": { + "instanceRefs": [], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "us-west-2 autoscale group", + "displayName": "aws-autoscale-group", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/amz-us-west-2-as-group" + }, + "name": "amz-us-west-2-as-group", + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Instance Groups" + ], + "summary": "Create an Instance Group", + "description": "Creates an new Instance Group resource.", + "operationId": "addInstanceGroup", + "requestBody": { + "description": "Defines the Instance Group resource to be added.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + }, + "example": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + } + } + } + }, + "responses": { + "202": { + "description": "The Instance Group resource has been accepted for creation. The Instance Group will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/instance-groups/{instanceGroupName}": { + "get": { + "tags": [ + "Instance Groups" + ], + "summary": "Get an Instance Group", + "description": "Returns information about a specified Instance Groupe resource.", + "operationId": "getInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Instance Group resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Instance Groups" + ], + "summary": "Upsert an Instance Group", + "description": "Creates a new Instance Group resource or updates an existing Instance Group resource.", + "operationId": "upsertInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + }, + "example": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "The Instance Group resource has been accepted for creation or update.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "delete": { + "tags": [ + "Instance Groups" + ], + "summary": "Delete an Instance Group", + "description": "Deletes the specified Instance Group resource.", + "operationId": "deleteInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Instance Group resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations": { + "get": { + "tags": [ + "Locations" + ], + "summary": "List all Locations", + "description": "Returns a list of all Locations.", + "operationId": "listLocations", + "responses": { + "200": { + "description": "Successfully retrieved a list of all of the configured Locations.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListLocationResponse" + }, + "example": { + "value": { + "items": [ + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "Location for instances where location has not been specified", + "displayName": "Unspecified (default)", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified" + }, + "name": "unspecified", + "tags": [ + "default" + ], + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Locations" + ], + "summary": "Create a Location", + "description": "Creates a new Location resource.", + "operationId": "addLocation", + "requestBody": { + "description": "Defines the Location resource to be added.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Location" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationRequest" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationRequest" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}": { + "get": { + "tags": [ + "Locations" + ], + "summary": "Get a Location", + "description": "Returns information about a specified Location resource.", + "operationId": "getLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Locations" + ], + "summary": "Upsert a Location", + "description": "Creates a new Location resource or updates an existing Location resource.", + "operationId": "upsertLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Location" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationRequest" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationRequest" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationRequest" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "201": { + "description": "Successfully updated the specified Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + } + } + }, + "delete": { + "tags": [ + "Locations" + ], + "summary": "Delete a Location", + "description": "Deletes the specified Location resource.", + "operationId": "deleteLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Location resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}/instances": { + "get": { + "tags": [ + "Instances" + ], + "summary": "List all Instances in a Location", + "description": "Returns the status and metadata for all of the Instances in the specified Location.", + "operationId": "listInstances", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully returned the status and metadata for all of the Instances in the specified Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceResponse" + }, + "examples": { + "INSTANCES": { + "$ref": "#/components/examples/ListInstanceResponse" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Instances" + ], + "summary": "Create an Instance", + "description": "Creates a new Instance resource.", + "operationId": "createInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + }, + "examples": { + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstanceRequest" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstanceRequest" + } + } + } + } + }, + "responses": { + "202": { + "description": "The Instance resource has been accepted for creation. The Instance will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + } + } + } + } + }, + "400": { + "description": "Bad input parameter or URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error creating the instance: could not parse the request payload. Check the format of the request, then try again.", + "code": 120647 + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing Instance resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error creating the instance: the instance already exists. Use a unique name for the instance, then try again.", + "code": 120652 + } + } + } + } + } + } + }, + "/infrastructure/locations/{locationName}/instances/{instanceName}": { + "get": { + "tags": [ + "Instances" + ], + "summary": "Get an Instance", + "description": "Returns the status and metadata for a single Instance.", + "operationId": "getInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "responses": { + "200": { + "description": "Successfully returned the details for an Instance.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/OtherInstance" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstance" + } + } + } + } + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error getting the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120603 + } + } + } + } + } + }, + "put": { + "tags": [ + "Instances" + ], + "summary": "Update an Instance", + "description": "Updates the description or display name of an existing Instance.", + "operationId": "updateInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the existing Instance.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/OtherInstance" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstance" + } + } + } + } + }, + "400": { + "description": "Bad input parameter or URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error updating the instance: could not parse the request payload. Check the format of the request, then try again.", + "code": 120612 + } + } + } + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error updating the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120614 + } + } + } + } + } + }, + "delete": { + "tags": [ + "Instances" + ], + "summary": "Delete an Instance", + "operationId": "deleteInstance", + "description": "Deletes the specified Instance.", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "responses": { + "202": { + "description": "Request for delete accepted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + } + } + } + }, + "204": { + "description": "Successfully deleted the Instance. No content is returned." + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error deleting the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120609 + } + } + } + }, + "409": { + "description": "Failed to delete the requested Instance resource.\n\nThe Instance is referenced by another resource. Remove the references to the Instance, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error deleting the instance: the NGINX instance is being configured. Try again later. If the problem persists, contact the system administrator.", + "code": 120640 + } + } + } + } + } + } + }, + "/infrastructure/locations/{locationName}/instance-templates": { + "get": { + "tags": [ + "Instance Templates" + ], + "summary": "List Instance Templates", + "description": "Returns an unfiltered list of all Instance Template resources in the specified Location.", + "operationId": "listInstanceTemplates", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved a list of all Instance Template resources for the specified Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceTemplateResponse" + }, + "examples": { + "INSTANCE_TEMPLATES": { + "$ref": "#/components/examples/AWSListResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Instance Templates" + ], + "summary": "Create an Instance Template", + "description": "Creates a new Instance Template resource.", + "operationId": "addInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "description": "Defines the Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceTemplate" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSRequest" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureRequestWithMarketplaceImageAndUsingExistingNic" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}/instance-templates/{instanceTemplateName}": { + "get": { + "tags": [ + "Instance Templates" + ], + "summary": "Get an Instance Template", + "description": "Gets information for the specified Instance Template resource.", + "operationId": "getInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Instance Templates" + ], + "summary": "Upsert an Instance Template", + "description": "Creates a new Instance Template resource or updates an existing Instance Template resource.", + "operationId": "upsertInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceTemplate" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSRequest" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureRequestWithCustomImageAndCreatingNewNicAndPublicIP" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully updated the specified Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "201": { + "description": "Successfully created the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + }, + "delete": { + "tags": [ + "Instance Templates" + ], + "summary": "Delete an Instance Template", + "description": "Deletes the specified Instance Template resource.", + "operationId": "deleteInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Instance Template resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/platform/integrations": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "List all Integrations", + "description": "Returns an unfiltered list of account Integrations.", + "operationId": "listIntegrations", + "responses": { + "200": { + "description": "Successfully retreived all Integration accounts.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListIntegrationResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Integrations" + ], + "summary": "Create an Integration account", + "description": "Creates a new Integration account.", + "operationId": "addIntegration", + "requestBody": { + "description": "Defines the Integration account to be added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing Integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/platform/integrations/{integrationName}": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get an Integration account", + "description": "Gets information about a specific Integration account.", + "operationId": "getIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "Integration not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Integrations" + ], + "summary": "Update an Integration account", + "description": "Updates an Integration account.", + "operationId": "updateIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "201": { + "description": "Successfully updated the specified Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Integrations" + ], + "summary": "Delete an Integration account", + "description": "Deletes the specified Integration account resource.", + "operationId": "deleteIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Integration resource." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/services/environments": { + "get": { + "tags": [ + "Environments" + ], + "summary": "List all Environments", + "description": "Returns a list of all Environment resources.\n", + "operationId": "listEnvironments", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Environment resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EnvironmentList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Environments" + ], + "summary": "Create an Environment", + "description": "Creates a new Environment resource.\n", + "operationId": "createEnvironment", + "requestBody": { + "description": "Defines the Environment resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "202": { + "description": "The Environment resource has been accepted for creation. The Environment will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/services/environments/{environmentName}": { + "get": { + "tags": [ + "Environments" + ], + "summary": "Get an Environment", + "description": "Returns information for the specified Environment.\n", + "operationId": "getEnvironment", + "responses": { + "200": { + "description": "Successfully returned information for the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Environments" + ], + "summary": "Upsert an Environment", + "description": "Creates a new Environment or updates an existing Environment resource.\n", + "operationId": "updateEnvironment", + "requestBody": { + "description": "Defines the Environment to create or the updates to make to an existing Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "201": { + "description": "Successfully created the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "202": { + "description": "The Environment resource has been accepted for creation or update. The Environment will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Environments" + ], + "summary": "Delete an Environment", + "description": "Deletes the specified Environment resource.", + "operationId": "deleteEnvironment", + "responses": { + "202": { + "description": "The Environment resource has been marked for deletion. The Environment will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Environment resource. No content returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the requested Environment resource.\n\nThe Environment contains references to other objects. Delete the referenced objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/certs": { + "get": { + "tags": [ + "Certs" + ], + "summary": "List all Certs", + "description": "Returns a list of Cert metadata objects for all of the Certs in the specified environment.", + "operationId": "listCerts", + "responses": { + "200": { + "description": "Successfully retrieved a list of Certs for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Certs" + ], + "summary": "Create a Cert", + "operationId": "createCert", + "description": "Creates a new Cert resource in the specified Environment.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cert" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/certs/{certName}": { + "get": { + "tags": [ + "Certs" + ], + "summary": "Get a Cert", + "operationId": "getCert", + "description": "Returns information for a specific Cert resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Cert.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Certs" + ], + "summary": "Upsert a Cert", + "operationId": "updateCert", + "description": "Creates a new Cert or updates an existing Cert resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cert" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Certs" + ], + "summary": "Delete a Cert", + "operationId": "deleteCert", + "description": "Deletes the specified Cert resource.", + "responses": { + "204": { + "description": "The specified Cert resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Cert resource failed.\nThe Cert is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "certName", + "description": "The name of the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/services/environments/{environmentName}/gateways": { + "get": { + "tags": [ + "Gateways" + ], + "summary": "List all Gateways", + "description": "Returns a list of all Gateways in the specified Environment.\n", + "operationId": "listGateways", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Gateways for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GatewayList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Gateways" + ], + "summary": "Create a Gateway", + "description": "Creates a new Gateway resource.\n", + "operationId": "createGateway", + "requestBody": { + "description": "Defines the Gateway resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "202": { + "description": "The Gateway resource has been accepted for creation. The Gateway will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to create a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Gateway resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/gateways/{gatewayName}": { + "get": { + "tags": [ + "Gateways" + ], + "summary": "Get a Gateway", + "description": "Returns information for the specified Gateway resource.\n", + "operationId": "getGateway", + "responses": { + "200": { + "description": "Successfully retrieved the requested Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Gateways" + ], + "summary": "Upsert a Gateway", + "description": "Creates a new Gateway or updates an existing Gateway resource.\n", + "operationId": "updateGateway", + "requestBody": { + "description": "Defines the Gateway resource to create or the updates to make to an existing Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "201": { + "description": "Successfully created the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "202": { + "description": "The Gateway resource has been accepted for creation or update. The Gateway will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Gateways" + ], + "summary": "Delete a Gateway", + "description": "Deletes the specified Gateway resource.", + "operationId": "deleteGateway", + "responses": { + "202": { + "description": "The Gateway resource has been marked for deletion. The Gateway will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Gateway resource. No content is returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete a Gateway resource failed.\nThe Gateway is referenced by an App Component(s) and cannot be deleted.\nDelete the App Component or remove the reference, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Gateway resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "gatewayName", + "description": "The name of the Gateway.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/GatewayName" + } + } + ] + }, + "/services/environments/{environmentName}/apps": { + "get": { + "tags": [ + "Apps" + ], + "summary": "List all Apps", + "description": "Returns a list of all App resources.\n", + "operationId": "listApps", + "responses": { + "200": { + "description": "Successfully retrieved a list of all App resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Create an App", + "description": "Creates a new App resource.", + "operationId": "createApp", + "requestBody": { + "description": "An App.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "202": { + "description": "The App resource has been accepted for creation. The App will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get an App", + "description": "Gets the information for a specific App resource.\n", + "operationId": "getApp", + "responses": { + "200": { + "description": "Successfully retrieved information for the requested App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Apps" + ], + "summary": "Upsert an App", + "description": "Creates a new App resource or updates an existing App resource.\n", + "operationId": "updateApp", + "requestBody": { + "description": "Defines the App resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "201": { + "description": "Successfully created the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "202": { + "description": "The App resource has been accepted for creation or update. The App will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Delete an App", + "description": "Deletes the specified App resource.\n\nYou must delete all of an App's child resources before you delete the App.\n", + "operationId": "deleteApp", + "responses": { + "202": { + "description": "The App resource has been marked for deletion. The App will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified App resource.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified App resource failed.\nThe App contains references to active objects and cannot be deleted. Delete the child objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/components": { + "get": { + "tags": [ + "Components" + ], + "summary": "List all Components", + "description": "Returns a list of all of the Component resources that are contained by the specified App.\n", + "operationId": "listAppComponents", + "responses": { + "200": { + "description": "Successfully retrieved a list of Component resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComponentList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + }, + "parameters": [ + { + "name": "strategyName", + "in": "query", + "description": "Filter desired component based on the strategy.", + "required": false, + "style": "form", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "policyName", + "in": "query", + "description": "Filter desired component based on the policy.", + "required": false, + "style": "form", + "explode": false, + "schema": { + "type": "string" + } + } + ] + }, + "post": { + "tags": [ + "Components" + ], + "summary": "Create a Component", + "description": "Creates a new Component resource.\n", + "operationId": "createAppComponent", + "requestBody": { + "description": "Defines the Component resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + }, + "examples": { + "ComponentRequest": { + "$ref": "#/components/examples/ComponentRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "202": { + "description": "The Component resource has been accepted for creation. The Component will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to create a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/components/{componentName}": { + "get": { + "tags": [ + "Components" + ], + "summary": "Get a Component", + "description": "Returns information for the specified Component.\n", + "operationId": "getAppComponent", + "responses": { + "200": { + "description": "Successfully returned the requested Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Components" + ], + "summary": "Upsert a Component", + "description": "Creates a new Component or updates an existing Component resource.\n", + "operationId": "updateAppComponent", + "requestBody": { + "description": "Defines the Component resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + }, + "examples": { + "ComponentRequest": { + "$ref": "#/components/examples/ComponentRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "201": { + "description": "Successfully created the specified Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "202": { + "description": "The Component resource has been accepted for creation or update. The Component will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Components" + ], + "summary": "Delete a Component", + "description": "Deletes the specified Component resource.", + "operationId": "deleteAppComponent", + "responses": { + "202": { + "description": "Component resource has been marked for deletion. The resource will be\ndeleted after the underlying resources have been freed.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Component. No content returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + }, + { + "name": "componentName", + "description": "The name of the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ComponentName" + } + } + ] + }, + "/services": { + "x-f5-experimental": true, + "get": { + "tags": [ + "Services" + ], + "summary": "List the metadata for all instances of the desired resource.", + "description": "Returns a metadata list of the requested resource. The resources that can be queried is currently restricted to published-apis.\n", + "operationId": "listResources", + "responses": { + "200": { + "description": "Successfully retrieved a metadata list of the requested resource.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceMeta" + } + } + } + } + }, + "400": { + "description": "The resource defined in the query parameters could not be found or is not yet supported. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The environment defined in the query parameters could not be found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "resource", + "in": "query", + "description": "Desired resource to list.", + "required": true, + "style": "form", + "explode": false, + "schema": { + "type": "string", + "enum": [ + "published-apis" + ] + } + }, + { + "name": "environment", + "in": "query", + "description": "Filter desired resource based on the environment.", + "required": false, + "style": "form", + "explode": false, + "schema": { + "type": "string" + } + } + ] + }, + "/services/api-definitions": { + "get": { + "tags": [ + "API Definitions" + ], + "summary": "List API Definitions", + "description": "Returns a list of API Definition resources.", + "operationId": "apiDefinitionsSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of all API Definitions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionList" + } + } + } + } + } + } + }, + "/services/api-definitions/{apiDefinitionName}": { + "get": { + "tags": [ + "API Definitions" + ], + "summary": "Get an API Definition", + "description": "Gets information about a specified API Definition.\n", + "operationId": "apiDefinitionsGet", + "responses": { + "200": { + "description": "Successfully returned the specified API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "404": { + "description": "The specified API Definition resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definitions" + ], + "summary": "Upsert an API Definition", + "description": "Creates a new API Definition or updates an existing API Definition resource.\n", + "operationId": "apiDefinitionsPut", + "requestBody": { + "description": "Defines the API Definition resource to create, or the updates to apply to an existing API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definitions" + ], + "summary": "Delete an API Definition", + "description": "Deletes the specified API Definition resource.", + "operationId": "apiDefinitionsDelete", + "responses": { + "204": { + "description": "Successfully deleted the requested API Definition resource. No content is returned.\n" + }, + "404": { + "description": "The specified API Definition resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition resource. Delete any referenced Published APIs or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions": { + "get": { + "tags": [ + "API Definition Versions" + ], + "summary": "List API Definition Versions", + "description": "Lists all Versions for the specified API Definition resource.\n", + "operationId": "definitionVersionsSearch", + "responses": { + "200": { + "description": "Successfully retrieved the list of API Definition Version resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "404": { + "description": "The specified API Definition resource was not found or does not contain any Versions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definition Versions" + ], + "summary": "Add an API Definition Version", + "description": "Creates a single new API Definition Version resource or multiple Version resources.\n", + "operationId": "definitionVersionsPutList", + "requestBody": { + "description": "Creates, updates, or deletes an API Definition Version resource. It interacts with a list of items.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully received the request to create the API Definition Version resource(s).", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition Version resource(s) as it has at least one dependent Published API. Delete the referenced Published API(s), then try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definition Versions" + ], + "summary": "Delete API Definition Versions", + "description": "Deletes all Versions for the specified API Definition resource.\n", + "operationId": "definitionVersionsDeleteList", + "responses": { + "204": { + "description": "Successfully deleted the Versions for the requested API Definition resource. No content is returned.\n" + }, + "404": { + "description": "The specified API Definition resource was not found or does not contain any Versions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the Versions for the specified API Definition resource. Delete or remove any references to Published APIs, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions/{version}": { + "get": { + "tags": [ + "API Definition Versions" + ], + "summary": "Get an API Definition Version", + "description": "Gets information about an API Definition Version resource.\n", + "operationId": "definitionVersionsGet", + "responses": { + "200": { + "description": "Successfully returned the specified API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "404": { + "description": "The specified API Definition Version resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definition Versions" + ], + "summary": "Upsert an API Definition Version", + "description": "Creates a single new Version resource or updates an existing API Definition Version resource.\n", + "operationId": "definitionVersionsPut", + "requestBody": { + "description": "Creates or updates an API Definition Version resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definition Versions" + ], + "summary": "Delete an API Definition Version", + "description": "Deletes an API Definition Version resource.\n", + "operationId": "definitionVersionsDelete", + "responses": { + "204": { + "description": "Successfully deleted the API Definition Version resource.\n" + }, + "404": { + "description": "The specified API Definition Version resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition resource. Delete or remove any references to Published APIs, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + }, + { + "$ref": "#/components/parameters/versionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions/{version}/import": { + "put": { + "tags": [ + "API Definition Version Import" + ], + "summary": "Import an API Definition Version", + "description": "Imports an API spec to the specified Version of an API Definition.\n\nUse this endpoint to import a raw API specification to define your API.\n\n- This endpoint accepts a valid OpenAPI 3 spec, formatted as valid JSON or YAML.\n- The file provided for import will be validated against the\n [OAS v3 schema](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.yaml).\n- You must specify a \"Content-Type\" header when importing an API spec.\n The endpoint accepts the following \"Content-Type\" values:\n\n - application/json\n - application/yaml\n - text/x-yaml\n - application/x-yaml\n - text/yaml\n", + "operationId": "definitionVersionsImport", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + }, + "application/yaml": { + "schema": { + "type": "string" + } + }, + "text/x-yaml": { + "schema": { + "type": "string" + } + }, + "application/x-yaml": { + "schema": { + "type": "string" + } + }, + "text/yaml": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully completed the API Version Import request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition Version resource from the spec provided.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "415": { + "description": "The request body contains an unsupported content type.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + }, + { + "$ref": "#/components/parameters/versionName" + } + ] + }, + "/security/identity-providers": { + "get": { + "tags": [ + "Identity Providers" + ], + "summary": "List Identity Providers", + "description": "Returns a list of all Identity Provider resources.\n\n> **Note:** These resources were known as Client Groups in pre-3.x versions of NGINX Controller.\n", + "operationId": "identityProvidersSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of Identity Provider resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/identity-providers/{identityProviderName}": { + "get": { + "tags": [ + "Identity Providers" + ], + "summary": "Get an Identity Provider", + "description": "Returns the specified Identity Provider resource.", + "operationId": "identityProvidersGet", + "responses": { + "200": { + "description": "Successfully returnd the specified Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "403": { + "description": "The request failed due to insufficient privileges.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Providers" + ], + "summary": "Upsert an Identity Provider", + "description": "Creates a new Identity Provider, or creates an existing Identity Provider resource.\n", + "operationId": "identityProvidersPut", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + }, + "examples": { + "IdentityProviderRequest": { + "$ref": "#/components/examples/IdentityProviderRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "201": { + "description": "Successfully created the requested Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create an Identity Provider resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Identity Providers" + ], + "summary": "Delete an Identity Provider", + "description": "Deletes the specified Identity Provider resource.", + "operationId": "identityProvidersDelete", + "responses": { + "202": { + "description": "The Identity Provider resource has been marked for deletion. The resource will be deleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Identity Provider resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete an Identity Provider resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + } + ] + }, + "/security/identity-providers/{identityProviderName}/clients": { + "get": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "List Identity Provider Clients", + "description": "Returns a list of all Identity Provider Client resources.\n", + "operationId": "identityProviderClientsSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of Identity Provider Client resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Create Multiple Identity Provider Clients", + "description": "Creates or updates multiple Identity Provider Client resources.\n", + "operationId": "identityProviderClientsPutList", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + }, + "examples": { + "IdentityProviderClientListRequest": { + "$ref": "#/components/examples/IdentityProviderClientListRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully upserted the Identity Provider Client resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider Client resources and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The Identity Provider Client resource conflicts with another resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + } + ] + }, + "/security/identity-providers/{identityProviderName}/clients/{identityProviderClientName}": { + "get": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Get an Identity Provider Client", + "description": "Returns information for the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsGet", + "responses": { + "200": { + "description": "Successfully returned the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Update an Identity Provider Client", + "description": "Updates the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsPut", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + }, + "examples": { + "IdentityProviderClientRequest": { + "$ref": "#/components/examples/IdentityProviderClientRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "201": { + "description": "Successfully created the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider Client resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Update an Identity Provider Client", + "description": "Updates the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsPatch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIdentityProviderClient" + }, + "examples": { + "IdentityProviderClientPatchMetadataRequest": { + "$ref": "#/components/examples/IdentityProviderClientPatchMetadataRequest" + }, + "IdentityProviderClientPatchDesiredStateRequest": { + "$ref": "#/components/examples/IdentityProviderClientPatchDesiredStateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "202": { + "description": "Successfully accepted the request to update an Identity Provider Client resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Delete an Identity Provider Client", + "description": "Deletes the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsDelete", + "responses": { + "202": { + "description": "Identity Provider Client resource has been marked for deletion. The resource will be\ndeleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Identity Provider Client resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + }, + { + "$ref": "#/components/parameters/identityProviderClientName" + } + ] + }, + "/services/environments/{environmentName}/devportals": { + "get": { + "tags": [ + "DevPortals" + ], + "summary": "List all DevPortals", + "description": "Returns a list of all DevPortal resources.\n", + "operationId": "ListDevPortals", + "responses": { + "200": { + "description": "Successfully retrieved a list of all DevPortals resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DevPortalsList" + } + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "DevPortals" + ], + "summary": "Create DevPortal", + "description": "Creates new Dev Portal resource.", + "operationId": "CreateDevPortal", + "requestBody": { + "description": "A Dev Portal.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created a specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "202": { + "description": "Dev Portal resource has been accepted for creation. A Dev Portal will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the DevPortal.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/devportals/{devPortalName}": { + "get": { + "tags": [ + "DevPortals" + ], + "summary": "Get Dev Portal", + "description": "Gets the information for a specific Dev Portal resource.\n", + "operationId": "GetDevPortal", + "responses": { + "200": { + "description": "Successfully retrieved information for the requested Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "DevPortals" + ], + "summary": "Upsert Dev Portal", + "description": "Creates a new Dev Portal resource or updates an existing Dev Portal resource.\n", + "operationId": "UpsertDevPortal", + "requestBody": { + "description": "Defines a Dev Portal resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "201": { + "description": "Successfully created the specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "202": { + "description": "The Dev Portal resource has been accepted for creation or update. Dev Portal will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "DevPortals" + ], + "summary": "Delete a DevPortal", + "description": "Deletes the specified Dev Portal resource.\nYou must delete all of a Dev Portal's child resources before you delete the Dev Portal.\n", + "operationId": "DeleteDevPortal", + "responses": { + "202": { + "description": "The DevPortal resource has been marked for deletion. DevPortal will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified DevPortal resource.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified App resource failed.\nThe App contains references to active objects and cannot be deleted. Delete the child objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the DevPortal.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "devPortalName", + "description": "The name of the DevPortal.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "/services/errorsets": { + "get": { + "tags": [ + "Error Sets" + ], + "summary": "List all Error Sets.", + "description": "Returns a list of all the Error Sets.", + "operationId": "listErrorSets", + "responses": { + "200": { + "description": "Successfully retrieved a list of Error Sets.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorSetList" + } + } + } + } + } + } + }, + "/services/errorsets/{errorSetName}": { + "get": { + "tags": [ + "ErrorSets" + ], + "summary": "Get an Error Set.", + "operationId": "getErrorSet", + "description": "Returns the information for a specific Error Set.", + "responses": { + "200": { + "description": "Successfully retrieved the requested Error Set.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorSet" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "errorSetName", + "description": "The name of the Error Set.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/published-apis": { + "get": { + "tags": [ + "Published APIs" + ], + "summary": "List Published APIs", + "description": "Returns a list of all Published APIs for the specified Environment and App.\n", + "operationId": "listPublishedAPIs", + "responses": { + "200": { + "description": "Successfully retrieved the list of Published APIs for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPIList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/environmentName" + }, + { + "$ref": "#/components/parameters/appName" + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/published-apis/{publishedApiName}": { + "get": { + "tags": [ + "Published APIs" + ], + "summary": "Get a Published API", + "description": "Gets information about the specified Published API.\n", + "operationId": "getPublishedAPI", + "responses": { + "200": { + "description": "Successfully retrieved the specified Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Published API resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Published APIs" + ], + "summary": "Upsert a Published API", + "description": "Creates a new Published API or updates an existing Published API resource.", + "operationId": "upsertPublishedAPI", + "requestBody": { + "description": "Defines the Published API to create, or the updates to apply to an existing Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "201": { + "description": "Successfully created the requested Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "202": { + "description": "The request to create a Published API succeeded. The resource will be created when the configuration is complete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Published APIs" + ], + "summary": "Delete a Published API", + "description": "Deletes the specified Published API resource.", + "operationId": "deletePublishedAPI", + "responses": { + "202": { + "description": "Published API has been marked for deletion. The resource will be\ndeleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Published API resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Published API resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/environmentName" + }, + { + "$ref": "#/components/parameters/appName" + }, + { + "$ref": "#/components/parameters/publishedApiName" + } + ] + }, + "/security/strategies": { + "get": { + "tags": [ + "Strategies" + ], + "summary": "List all Strategies", + "description": "Returns a list of Strategy metadata objects for all of the Strategies.", + "operationId": "StrategyServiceList", + "responses": { + "200": { + "description": "Successfully retrieved a list of Strategies.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Strategies" + ], + "summary": "Create a Strategy", + "operationId": "StrategyServicePost", + "description": "Creates a new Strategy resource.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Strategy" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Strategy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/strategies/{strategyName}": { + "get": { + "tags": [ + "Strategies" + ], + "summary": "Get a Strategy", + "operationId": "StrategyServiceGet", + "description": "Returns information for a specific Strategy resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Strategy.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Strategies" + ], + "summary": "Upsert a Strategy", + "operationId": "StrategyServicePut", + "description": "Creates a new Strategy or updates an existing Strategy resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Strategy" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Strategy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Strategy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Strategies" + ], + "summary": "Delete a Strategy", + "operationId": "StrategyServiceDelete", + "description": "Deletes the specified Strategy resource.", + "responses": { + "204": { + "description": "The specified Strategy resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Strategy resource failed.\nThe Strategy is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "strategyName", + "description": "The name of the Strategy.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/security/policies": { + "get": { + "tags": [ + "Policies" + ], + "summary": "List all Policies", + "description": "Returns a list of Policy metadata objects for all of the Policies.", + "operationId": "listPolicies", + "responses": { + "200": { + "description": "Successfully retrieved a list of Policies.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Policies" + ], + "summary": "Create a Policy", + "operationId": "createPolicy", + "description": "Creates a new Policy resource.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/policies/{policyName}": { + "get": { + "tags": [ + "Policies" + ], + "summary": "Get a Policy", + "operationId": "getPolicy", + "description": "Returns information for a specific Policy resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Policy.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Policies" + ], + "summary": "Upsert a Policy", + "operationId": "updatePolicy", + "description": "Creates a new Policy or updates an existing Policy resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Policies" + ], + "summary": "Delete a Policy", + "operationId": "deletePolicy", + "description": "Deletes the specified Policy resource.", + "responses": { + "204": { + "description": "The specified Policy resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Policy resource failed.\nThe Policy is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "policyName", + "description": "The name of the Policy.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + } + }, + "components": { + "parameters": { + "environmentName": { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + "appName": { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + }, + "apiDefinitionName": { + "name": "apiDefinitionName", + "in": "path", + "description": "The name of the API Definition resource.", + "required": true, + "style": "simple", + "explode": false, + "example": "shopping-app-api-def", + "schema": { + "type": "string" + } + }, + "publishedApiName": { + "name": "publishedApiName", + "in": "path", + "description": "The name of the Published API resource.", + "required": true, + "style": "simple", + "explode": false, + "example": "shopping-app-api-staging", + "schema": { + "type": "string" + } + }, + "versionName": { + "name": "version", + "in": "path", + "description": "The Version of the API Definition.", + "required": true, + "style": "simple", + "explode": false, + "example": "v1_2fd4e1c6", + "schema": { + "type": "string" + } + }, + "LocationName": { + "name": "locationName", + "in": "path", + "description": "The name of the Location that contains the Instance.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceName": { + "name": "instanceName", + "in": "path", + "description": "The name of the Instance.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceGroupName": { + "name": "instanceGroupName", + "in": "path", + "description": "The name of the Instance Group.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceTemplateName": { + "name": "instanceTemplateName", + "in": "path", + "description": "The name of the Instance Template resource.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "identityProviderName": { + "name": "identityProviderName", + "in": "path", + "description": "The name of the Identity Provider.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "identityProviderClientName": { + "name": "identityProviderClientName", + "in": "path", + "description": "The name of the Identity Provider Client.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "IntegrationName": { + "name": "integrationName", + "in": "path", + "description": "The name of the Integration resource.", + "required": true, + "schema": { + "type": "string" + } + } + }, + "schemas": { + "ResourceName": { + "type": "string", + "description": "The name of a resource.", + "example": "production" + }, + "LocationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherLocation" + }, + { + "$ref": "#/components/schemas/AWSLocation" + }, + { + "$ref": "#/components/schemas/AzureLocation" + }, + { + "$ref": "#/components/schemas/VSphereLocation" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_LOCATION": "#/components/schemas/OtherLocation", + "AWS_LOCATION": "#/components/schemas/AWSLocation", + "AZURE_LOCATION": "#/components/schemas/AzureLocation", + "VSPHERE_LOCATION": "#/components/schemas/VSphereLocation" + } + } + }, + "OtherLocation": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type. Select the environment where you want to create the location. \nTo create a location that’s not specific to any cloud environment, select OTHER_LOCATION.\n", + "enum": [ + "OTHER_LOCATION" + ] + } + } + }, + "AWSLocation": { + "type": "object", + "required": [ + "vpcID", + "region", + "integrationRef", + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type. Select the environment where you want to create the location. \nTo create a location that’s specific to the AWS cloud environment, select AWS_LOCATION.\n", + "enum": [ + "AWS_LOCATION" + ] + }, + "region": { + "description": "The AWS region.\n", + "type": "string" + }, + "vpcID": { + "type": "string", + "description": "The vpcID of the AWS Virtual Private Cloud (VPC) where new Instances created under this location should reside.\nThe VPC must be in the specified AWS region.\n" + }, + "integrationRef": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "AzureLocation": { + "type": "object", + "required": [ + "type", + "region", + "resourceGroup", + "subscriptionID", + "integrationRef" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type.", + "enum": [ + "AZURE_LOCATION" + ] + }, + "region": { + "description": "The Azure region.", + "type": "string" + }, + "resourceGroup": { + "type": "string", + "description": "The name of the resourceGroup." + }, + "subscriptionID": { + "type": "string", + "description": "The unique alphanumeric string that identifies the Azure subscription." + }, + "integrationRef": { + "description": "Integration ref.", + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "VSphereLocation": { + "type": "object", + "required": [ + "type", + "datacenter", + "integrationRef" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type.", + "enum": [ + "VSPHERE_LOCATION" + ] + }, + "datacenter": { + "description": "A VSphere data center.", + "type": "string" + }, + "folder": { + "type": "string", + "description": "The name of the VM folder that you want to add your instance to. If no name is provided, the instance will be created in the folder containing the VM template your instance is cloned from." + }, + "integrationRef": { + "description": "Integration ref.", + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "Location": { + "required": [ + "metadata", + "desiredState" + ], + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/LocationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/LocationState" + } + } + }, + "GetLocationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Location" + } + ] + }, + "ListLocationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Location" + } + } + } + }, + "AppList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "App": { + "type": "object", + "description": "An App is a collection of Components.", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "x-f5-experimental": true, + "type": "object" + }, + "currentStatus": { + "$ref": "#/components/schemas/AppCurrentStatus" + } + } + }, + "AppCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "componentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "Component": { + "description": "A component represents the processing –- reverse proxying, rate limiting, security policy enforcement, header rewrites, etc.\n–- of traffic associated with a logical part (for example, microservice) of an application/API. It also defines the subsequent\nload balancing of traffic to workloads implementing that part of the application/API.\n\nA component can be either a web or a TCP/UDP component –- indicated by the component type. Web components are used to\nconfigure NGINX functionality associated with HTTP/HTTPS protocols and inherit web and common settings from linked Gateways.\nTCP/UDP components are used to configure NGINX functionality associated with TCP/UDP protocols\nand inherit TCP/UDP and common settings from linked Gateways.\n", + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/ComponentDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/ComponentCurrentStatus" + } + } + }, + "ComponentName": { + "type": "string" + }, + "ComponentList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "WorkloadGroupSnippet": { + "description": "The NGINX directives to apply to the upstream blocks generated by the workload groups\nin the backend. Directives are applied to all workload groups by default. Use\napplicableWorkloadGroups to apply directives only to specific workload groups.\n", + "allOf": [ + { + "type": "object", + "properties": { + "applicableWorkloadGroups": { + "type": "array", + "description": "Workload group name.", + "items": { + "type": "string" + } + } + } + }, + { + "$ref": "#/components/schemas/NginxConfig" + } + ] + }, + "ComponentConfigSnippets": { + "type": "object", + "description": "The NGINX config snippets to insert into the server and location blocks\ngenerated by the component URIs.\n\n**Caution**: When you use snippets to customize your NGINX configuration, your changes are\napplied to the nginx.conf file *as is*. NGINX Controller does not verify that your configuration\nis valid before applying the snippet.\n\nWe strongly recommend verifying snippets in a lab environment before making any changes\nin production.\n", + "properties": { + "uriSnippets": { + "description": "An array of URI snippets.\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/UriSnippet" + } + }, + "workloadGroupSnippets": { + "description": "An array of workload group snippets.\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkloadGroupSnippet" + } + } + } + }, + "ComponentStateCommon": { + "type": "object", + "description": "Settings common to Web & TCP/UDP Components.", + "properties": { + "configSnippets": { + "$ref": "#/components/schemas/ComponentConfigSnippets" + } + } + }, + "ComponentCurrentStatus": { + "description": "The current snapshot of the component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this Component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/ComponentWebCurrentStatus" + }, + { + "$ref": "#/components/schemas/ComponentTcpUdpCurrentStatus" + } + ] + }, + "ComponentWebCurrentStatus": { + "description": "The current snapshot of the web component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "properties": { + "componentType": { + "description": "Defines what type of Component this is.", + "type": "string", + "enum": [ + "WEB" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentWebIngress" + }, + "backend": { + "$ref": "#/components/schemas/WebBackend" + }, + "programmability": { + "$ref": "#/components/schemas/Programmability" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "security": { + "$ref": "#/components/schemas/Security" + }, + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + }, + "caching": { + "$ref": "#/components/schemas/Caching" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "ComponentTcpUdpCurrentStatus": { + "description": "The current snapshot of the TCP/UDP component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "properties": { + "componentType": { + "description": "Defines what type of Component this is.", + "type": "string", + "enum": [ + "TCPUDP" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentTcpUdpIngress" + }, + "backend": { + "$ref": "#/components/schemas/TcpUdpBackend" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "GatewayName": { + "type": "string" + }, + "GatewayList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "GatewayCurrentStatus": { + "description": "The current snapshot of the gateway settings that are reflected in the configuration on NGINX instances referenced by this Gateway.\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayWebState" + }, + { + "$ref": "#/components/schemas/GatewayStateCommon" + }, + { + "type": "object", + "properties": { + "ingress": { + "$ref": "#/components/schemas/GatewayIngress" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "Gateway": { + "type": "object", + "description": "A Gateway represents the initial network entry point of application and/or API traffic into an NGINX instance that is\nin the data path of this traffic. Gateway settings are combined with Component settings that reference the Gateway;\nthe resulting composite config is sent to the NGINX instances that the Gateway references.\n\nA Gateway can be referenced by either web components and/or TCP/UDP components. Web-only settings in the Gateway (for example, web URIs)\napply only to web components. TCP/UDP-only settings in the Gateway (for example, TCP/UDP URIs) apply only to TCP/UDP components.\nWeb and TCP/UDP common settings in the Gateway (for example, global TLS, socket) apply to both web and TCP/UDP components.\n\nExamples:\nGateway with web and TCP/UDP URIs, web-specific settings, common settings. Web URIs and web settings apply to web components.\nCommon settings apply to both component types. TCP/UDP URIs apply only to TCP/UDP components –- presently, there are no other TCP/UDP only settings.\n\nGateway web URIs (for example, https://www.xyz.com) combined with web component URIs (for example, /blog) define web URI config (https://www.xyz.com/blog).\nComponent TCP/UDP URIs define TCP/UDP URI config (for example, tcp+tls://192.168.1.1:200); Gateway TCP/UDP URIs can provide TLS info plus restrict\nwhich TCP/UDP URIs can be in the component. Alternatively, component URIs fully define the URI config if the Gateway has no URIs.\n\nIf only a single URI type is in the Gateway, the URI config for that type is determined by combining the Gateway URIs with\nthe URIs from components of that type; only component URIs are used for the URI config for the other type.\n\nFor HTTPS URIs, global Gateway TLS settings are used when more specific TLS info is not present in the Gateway URIs,\nor for component URIs that have an HTTPS protocol and hostnames with no specific URI or component global TLS settings defined.\n\nFor tcp+tls URIs, Gateway TLS settings are used when TLS info is not defined in a component URI or component global TLS.\nA Gateway URI’s TLS info is used if it encompasses the component URI. For example, tcp+tls://192.168.1.5:100-104 in the Gateway and\ncomponent URI of tcp+tls://192.168.1.5:100. Global Gateway TLS is used if no other TLS settings apply.\n", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/GatewayDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/GatewayCurrentStatus" + } + } + }, + "GZip": { + "properties": { + "isEnabled": { + "type": "boolean", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip" + } + }, + "buffers": { + "type": "object", + "properties": { + "number": { + "type": "integer" + }, + "size": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + } + }, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_buffers" + } + }, + "level": { + "type": "integer", + "minimum": 1, + "maximum": 9, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_comp_level" + } + }, + "disabledUserAgents": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_disable" + } + }, + "httpVersion": { + "type": "string", + "pattern": "^[1-3]{1}\\.[0-1]{1}$", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version" + } + }, + "minLength": { + "type": "integer", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_min_length" + } + }, + "proxied": { + "type": "string", + "enum": [ + "DISABLED", + "EXPIRED", + "NOCACHE", + "NOSTORE", + "PRIVATE", + "NOLASTMODIFIED", + "NOETAG", + "AUTH", + "ANY" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied" + } + }, + "mimeTypes": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_types" + } + }, + "vary": { + "type": "string", + "enum": [ + "DISABLED", + "ENABLED" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_vary" + } + }, + "static": { + "type": "string", + "enum": [ + "DISABLED", + "ENABLED", + "ALWAYS" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html#gzip_static" + } + } + } + }, + "Compression": { + "description": "Gzip compression settings.", + "type": "object", + "properties": { + "gzip": { + "$ref": "#/components/schemas/GZip" + } + } + }, + "GatewayWebState": { + "description": "Non-ingress settings in a Gateway that apply only to Web Components.", + "type": "object", + "properties": { + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + } + } + }, + "NginxDirective": { + "required": [ + "directive" + ], + "properties": { + "directive": { + "type": "string", + "description": "The name of the NGINX directive. For a list of NGINX Directives, refer to [the NGINX documentation](http://nginx.org/en/docs/dirindex.html).\n" + }, + "args": { + "type": "array", + "description": "Directive arguments.", + "items": { + "type": "string" + } + }, + "block": { + "type": "array", + "description": "The directives to include within a block directive or context.", + "items": { + "$ref": "#/components/schemas/NginxDirective" + } + } + } + }, + "NginxConfig": { + "type": "object", + "required": [ + "directives" + ], + "properties": { + "directives": { + "type": "array", + "description": "List of NGINX directives to add to the configuration.\n", + "items": { + "$ref": "#/components/schemas/NginxDirective" + } + } + } + }, + "URIMatchMethod": { + "description": "Specifies how to determine a match between an incoming Web URI and configured Web URI.", + "type": "string", + "enum": [ + "PREFIX", + "REGEX", + "REGEX_CASE_SENSITIVE", + "SUFFIX", + "EXACT" + ], + "default": "PREFIX" + }, + "ApplicableUri": { + "type": "object", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string" + }, + "matchMethod": { + "$ref": "#/components/schemas/URIMatchMethod" + } + } + }, + "ApplicableUris": { + "type": "array", + "description": "Defines an array of ingress URIs with a corresponding matchMethod that this rule/snippet applies to.\nBy default, a rule/snippet applies to all ingress URIs in the gateway/component. A snippet can be\napplied only to URIs of the gateway/component that it is in. A snippet in a component cannot be\napplied to the gateway URI. However, a rule can be applied at a gateway level by specifying ingress\nURIs from the gateway, for example, \"http://www.nginx.com\". Note that applying the rule to URIs at\na gateway level can affect other components. The URI and the matchMethod must match an ingress URI defined\neither at the component or gateway level. If no match is found, the request is rejected.\n", + "items": { + "$ref": "#/components/schemas/ApplicableUri" + } + }, + "UriSnippet": { + "description": "The NGINX directives to apply to the server and location blocks generated by the URIs.\nDirectives are applied to all URIs by default. Use applicableURIs to apply directives\nonly to specific URIs.\n", + "allOf": [ + { + "type": "object", + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + { + "$ref": "#/components/schemas/NginxConfig" + } + ] + }, + "DiskStore": { + "type": "object", + "required": [ + "path", + "maxSize", + "minFree", + "inMemoryStoreSize" + ], + "properties": { + "path": { + "description": "Defines what the path is for this storage", + "example": "/tmp/hdd1", + "type": "string", + "minLength": 1 + }, + "isDefault": { + "description": "When more than one disk stores are specified, the data stored in the cache is split by percentage or string.\n`isDefault` specifies a default storage for cache data that does not meet the percent or string criteria.\n", + "type": "boolean", + "default": false + }, + "percentCriteria": { + "description": "Defines the percentage that should be allocated to this store. This must be specified when `criteriaType` is PERCENTAGE.", + "type": "string", + "example": "75%", + "pattern": "\\d+(?:\\.\\d+)?%" + }, + "stringCriteria": { + "description": "Defines string pattern of data that should go in to this store. This must be specified when `criteriaType` is STRING", + "type": "array", + "items": { + "description": "Depending on the 'SplitConfig' \"Key\", string could have different patterns.\nLike ~.mp3$ for REGEX match or any string like 'hostname.*' or IP address\n", + "type": "string", + "minLength": 1, + "example": "[\"~.mp3$\", \"~*.avi\"],[\"10.1.1.1\", \"10.1.1.2\"]" + } + }, + "maxSize": { + "type": "string", + "description": "Defines the maximum size that the cache can grow to", + "example": "5G", + "pattern": "^[0-9]+[kKmMgG]?$" + }, + "minFree": { + "type": "string", + "description": "Defines the minimum amount of free disk space on the drive for the cache. If the free disk space drops below the minimum value, the cache is trimmed.", + "example": "10k", + "pattern": "^[0-9]+[kKmMgG]?$" + }, + "inMemoryStoreSize": { + "type": "string", + "description": "Defines the size of the memory zone where information about the data is stored.", + "example": "500m", + "pattern": "^[0-9]+[kKmM]?$" + }, + "trimPolicy": { + "description": "Defines how we configure `manager_files` for the proxy_cache_path\nCache management is performed in iterations. During one iteration no more than `maxFiles` items are deleted\nThis policy defines how many files are deleted, how often and how long the process lasts.\n", + "type": "object", + "properties": { + "maxFiles": { + "type": "integer", + "description": "Defines how many files are deleted in one iteration. NGINX defaults this to 100", + "minimum": 1 + }, + "frequency": { + "type": "string", + "description": "Defines the length of the pause between cache management iterations. The default for NGINX is 50 milliseconds.", + "example": "2s", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + }, + "durationThreshold": { + "type": "string", + "description": "Defines the duration for one cache management iteration. The default for NGINX is 200 milliseconds.", + "example": "2s", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + } + } + }, + "loaderPolicy": { + "description": "Defines how `loader_files` are configured for the `proxy_cache_path`.\nloading is done in iterations. During one iteration no more than maxFiles items are loaded\nDefines how previosly cached data is loadded in the cache `Zone`.\n", + "type": "object", + "properties": { + "maxFiles": { + "type": "integer", + "description": "During one iteration no more than `files` items are loaded. NGINX defaults this to 100", + "minimum": 1 + }, + "frequency": { + "type": "string", + "description": "Defines the length of the pause between cache management iterations. For NGINX, the default is 50 milliseconds.", + "example": "2s", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + }, + "durationThreshold": { + "type": "string", + "description": "Defines the maximum duration for one cache management iteration. For NGINX, the default is 200 milliseconds.", + "example": "2s", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + } + } + }, + "purgerPolicy": { + "description": "Defines how we configure `purger` for the proxy_cache_path\nPurger is done in iterations. During one iteration no more than maxFiles items are scanned\nSpecifies whether cache entires matching a wildcard key are removed from the disk by the cache purger.\n", + "type": "object", + "properties": { + "maxFiles": { + "type": "integer", + "description": "Defines the number of items to scan during one iteration. For NGINX, default is 10 items.", + "minimum": 1 + }, + "frequency": { + "type": "string", + "description": "Defines the length of the pause between cache purge iterations. For NGINX, the default is 50 milliseconds.", + "example": "10ms", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + }, + "durationThreshold": { + "type": "string", + "description": "Defines the maximum duration for one cache purge iteration. For NGINX, the default is 50 milliseconds.", + "example": "10ms", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + } + } + }, + "directoryLevel": { + "type": "object", + "description": "Defines the level of the directory structure that NGINX creates for the cache.\nDefines the cache hierarchy levels from 1 to 3, with each level accepting a value of `1` or `2`.\nFor example, `levels=1:2` file names in a cache will look like this. (**Note**: `/c/29` & `29c` at end)\n/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c\n", + "properties": { + "first": { + "type": "integer", + "minimum": 1, + "maximum": 2 + }, + "mid": { + "type": "integer", + "minimum": 1, + "maximum": 2 + }, + "last": { + "type": "integer", + "minimum": 1, + "maximum": 2 + } + } + }, + "tempPath": { + "description": "Determines whether you'll use a temporary path for the cache disk store.\nYou can define the path location by using `proxy_temp_path` in a `configSnippet` for the Component.\n", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ] + }, + "inactiveTime": { + "description": "Defines the length of time to wait before removing cached data that haven't been accessed.", + "example": "5s", + "type": "string", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + } + } + }, + "Caching": { + "description": "Cache settings for components applicable to web client requests.", + "type": "object", + "required": [ + "diskStores" + ], + "properties": { + "splitConfig": { + "description": "Allows the cache to be split among multiple storage devices", + "type": "object", + "required": [ + "criteriaType" + ], + "properties": { + "key": { + "type": "string", + "description": "Defines the variable on which the cache is split across different storage devices.", + "example": "${remote_addr}${http_user_agent}${date_gmt}", + "minLength": 1 + }, + "criteriaType": { + "type": "string", + "description": "Defines the criteria on which the cache is split across different storage devices.", + "enum": [ + "PERCENTAGE", + "STRING" + ], + "default": "PERCENTAGE" + } + } + }, + "diskStores": { + "description": "Defines an array of disk stores. If more than one is specified, the cache contents are split between the stores using splitConfig settings.\nIf criteriaType is PERCENTAGE, then percentCriteria should be specified to control how much goes in to a particular store.\nIf the criteriaType is STRING, then stringCriteria should be specified to control the split based on a pattern match.\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/DiskStore" + } + } + } + }, + "ComponentWebDesiredState": { + "description": "The desired settings in the Web Component that the user wants in the configuration on NGINX instances associated with\nthe Gateways which this component references.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "required": [ + "ingress", + "backend" + ], + "properties": { + "componentType": { + "description": "Defines the Component type. The default type is Web.", + "type": "string", + "enum": [ + "WEB" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentWebIngress" + }, + "backend": { + "$ref": "#/components/schemas/WebBackend" + }, + "programmability": { + "$ref": "#/components/schemas/Programmability" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "security": { + "$ref": "#/components/schemas/Security" + }, + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + }, + "caching": { + "$ref": "#/components/schemas/Caching" + } + } + } + ] + }, + "ComponentTcpUdpIngress": { + "description": "Ingress settings in a TCP/UDP Component.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentIngressCommon" + } + ] + }, + "TcpUdpMonitoring": { + "description": "Health monitor settings across all workload groups in a TCP/UDP Component.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitoringCommon" + }, + { + "type": "object", + "properties": { + "send": { + "description": "Probe request for a TCP/UDP monitor.", + "type": "string" + }, + "response": { + "description": "Case-sensitive regular expression for the expected success response to a TCP/UDP monitor.", + "type": "string" + } + } + } + ] + }, + "TcpUdpProxy": { + "description": "Proxy retry and timeout settings applicable to servers in a TcpUdp workloadGroup associated with a Component.", + "type": "object", + "properties": { + "nextUpstream": { + "description": "When a connection to the proxied server cannot be established, determines whether a client connection will be passed to the next server.", + "type": "string", + "enum": [ + "ON", + "OFF" + ], + "default": "OFF" + }, + "connectTimeout": { + "description": "Defines a timeout for establishing a connection with the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + }, + "proxyTimeout": { + "description": "Sets the timeout between two successive read or write operations on client or proxied server connections.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + } + } + }, + "TcpUdpWorkloadGroup": { + "description": "Group of servers hosting a part of a TCP/UDP application represented by a Component.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkloadGroupCommon" + }, + { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/components/schemas/TcpUdpProxy" + }, + "useServerPort": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "uris": { + "type": "object", + "description": "The URI of a server that hosts a TCP/UDP application.\n\nThe URI must conform to the format `schema://address:port`.\n\n- The schema must be one of the following: `tcp`, `udp`, or `tcp+tls`.\n- The address value can be an IP address or a host name.\n- All three elements -- schema, address, and port -- are required.\n\nNote: When `useServerPort` is `ENABLED`, then you should define a single URI that uses the `schema://address` format.\nDefining a `port` value for the URI when also using `useServerPort` will result in an error.\n\nFor example:\n\n- `tcp://192.0.2.247:8443`\n- `tcp+tls://192.0.2.247:8449`\n- `udp://www.f5workload.com:989`\n", + "additionalProperties": { + "$ref": "#/components/schemas/WorkloadUri" + } + } + } + } + ] + }, + "TcpUdpBackend": { + "description": "Backend settings in a TCP/UDP Component.\n", + "type": "object", + "properties": { + "monitoring": { + "$ref": "#/components/schemas/TcpUdpMonitoring" + }, + "workloadGroups": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TcpUdpWorkloadGroup" + } + } + } + }, + "ComponentTcpUdpDesiredState": { + "description": "The desired settings in the TCP/UDP Component to use in the configuration on NGINX instances associated with the Gateways that this Component references.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "required": [ + "componentType", + "ingress", + "backend" + ], + "properties": { + "componentType": { + "description": "Defines what type of Component this is. The type must be TCPUDP.", + "type": "string", + "enum": [ + "TCPUDP" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentTcpUdpIngress" + }, + "backend": { + "$ref": "#/components/schemas/TcpUdpBackend" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + } + } + } + ] + }, + "ComponentDesiredState": { + "description": "The desired component settings to use in the NGINX instance configuration that's associated with\nthe Gateways that this component references.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/ComponentWebDesiredState" + }, + { + "$ref": "#/components/schemas/ComponentTcpUdpDesiredState" + } + ] + }, + "GatewayConfigSnippets": { + "type": "object", + "description": "The NGINX config snippets to insert into the NGINX config generated by the gateway.\nNote that the default directives and directives generated by the native parts of the\nAPI(API sections other than configSnippets) cannot be overriden.\nmainSnippet - Insert directives in the main context.\nhttpSnippet - Insert directives in the http context.\nstreamSnippet - Insert directives in the stream context.\nuriSnippet - Insert into server blocks generated by the gateway URIs.\n This applies only to HTTP URIs, since TCP and UDP URIs do not\n generate server blocks.\n\n**Caution**: When you use snippets to customize your NGINX configuration, your changes are\napplied to the nginx.conf file *as is*. NGINX Controller does not verify that your configuration\nis valid before applying the snippet.\n\nWe strongly recommend verifying snippets in a lab environment before making any changes\nin production.\n", + "properties": { + "mainSnippet": { + "$ref": "#/components/schemas/NginxConfig" + }, + "httpSnippet": { + "$ref": "#/components/schemas/NginxConfig" + }, + "streamSnippet": { + "$ref": "#/components/schemas/NginxConfig" + }, + "uriSnippets": { + "description": "An array of URI snippets.\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/UriSnippet" + } + } + } + }, + "HA": { + "description": "Data path high availability settings", + "type": "object", + "properties": { + "isEnabled": { + "type": "boolean", + "description": "Enables or disables HA.\n\nWhen set to `true`, supports configuring instances in an active‑passive, high‑availability (HA) setup.\n\nTo configure the gateway on HA mode:\n - `keepalived` must be installed and configured on the desired instances.\n - At least one listen IP address must be specified in the `listenIps` section within `InstanceRefs`\n\n See the `listenIps` section for additional requirements for configuring HA.\n" + } + } + }, + "GatewayStateCommon": { + "description": "Non-ingress settings in a Gateway that apply to Web and TCP/UDP Components.", + "type": "object", + "properties": { + "configSnippets": { + "$ref": "#/components/schemas/GatewayConfigSnippets" + }, + "ha": { + "$ref": "#/components/schemas/HA" + } + } + }, + "ServiceConfigState": { + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "default": "DISABLED" + }, + "GatewaySocketSettings": { + "description": "Socket settings in a Gateway.", + "type": "object", + "properties": { + "setFib": { + "x-f5-experimental": true, + "type": "integer" + }, + "fastOpen": { + "x-f5-experimental": true, + "type": "integer" + }, + "acceptFilter": { + "x-f5-experimental": true, + "type": "string", + "enum": [ + "DATA_READY", + "HTTP_READY" + ] + }, + "deferred": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "backlog": { + "x-f5-experimental": true, + "type": "integer", + "default": -1 + }, + "isIpv6Only": { + "x-f5-experimental": true, + "type": "boolean", + "default": false + }, + "reusePort": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "tcpKeepAlive": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "idle": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "interval": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "count": { + "type": "integer" + } + } + }, + "receiveBufferSize": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + }, + "sendBufferSize": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + } + } + }, + "TLS": { + "description": "TLS settings applicable to URIs.", + "type": "object", + "required": [ + "certRef" + ], + "properties": { + "certRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "protocols": { + "type": "array", + "items": { + "type": "string", + "pattern": "TLSv1|TLSv1\\.[1-3]|SSLv2|SSLv3" + } + }, + "cipher": { + "type": "string", + "example": "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;" + }, + "preferServerCipher": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "sessionCache": { + "type": "string", + "enum": [ + "OFF", + "NONE", + "BUILTIN", + "SHARED" + ], + "default": "OFF" + } + } + }, + "IngressUri": { + "type": "object", + "properties": { + "matchMethod": { + "$ref": "#/components/schemas/URIMatchMethod" + }, + "tls": { + "$ref": "#/components/schemas/TLS" + }, + "serverPoolPort": { + "description": "The port number used when the IngressUri is deployed to an Instance that's a member of a BIG-IP server pool.", + "type": "integer" + } + } + }, + "IngressUris": { + "type": "object", + "description": "Defines the URI in Gateways and Components. The URI has different requirements depending on where it is used.\n\nFor Web URIs in Gateways, `uris` must be a complete URI that follows the format `://host[:port]`;\nadditionally each URI can have a match method specified and an HTTPS URI can include TLS information.\n Examples:\n - `http://www.f5.com`\n - `https://www.f5.com`\n - `http://www.f5.com:8080`\n - `http://*.info.f5.com`\n\nFor Web URIs in Components, `uris` can be either a complete URI that follows the format `://host[:port][/path]`\nor a relative path that follows the format `/path[/...]`;\nadditionally each URI can have a match method specified and an HTTPS URI can include TLS information.\n Examples:\n - `/images`\n - `/*.jpg`\n - `/locations/us/wa*`\n - `http://www.f5.com:8080/sales`\n - `http://*.f5.com:5050/testing`\n\nFor TCP/UDP URIs in Gateways and Components,`uris` must be a complete URI that follows the format `://<*|IP>:`;\nadditionally a tcp+tls URI can include TLS information. Match method is not applicable to TCP/UDP URIs.\n Examples:\n - `tcp://192.168.1.1:12345`\n - `tcp+tls://192.168.1.1:12346`\n - `tcp://192.168.1.1:12345-12350`\n - `tcp://*:12345`\n - `udp://192.168.1.1:12345`\n - `udp://*:12345`\n\nIn a TCP/UDP Component, URIs can either all have a protocol of udp or a mix of TCP and tcp+tls.\n", + "additionalProperties": { + "description": "Provide the URI associated with the resource.", + "$ref": "#/components/schemas/IngressUri" + } + }, + "ComponentIngressCommon": { + "description": "Ingress settings common to Web and TCP/UDP components.", + "type": "object", + "required": [ + "uris" + ], + "properties": { + "uris": { + "$ref": "#/components/schemas/IngressUris" + }, + "gatewayRefs": { + "description": "Reference(s) to existing Gateway resource(s).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "tls": { + "$ref": "#/components/schemas/TLS" + } + } + }, + "ComponentWebIngressClient": { + "description": "Non-buffer settings in a Component applicable to Web client requests.", + "type": "object", + "properties": { + "bodyInFileOnly": { + "description": "Determines whether NGINX Controller should save the entire client request body into a file.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED", + "CLEAN" + ], + "default": "DISABLED", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only" + } + }, + "bodyTimeout": { + "description": "Defines a timeout for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout" + } + }, + "maxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.\n\nDisables checking of client request body size when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + } + } + }, + "ComponentWebIngress": { + "description": "Ingress settings in a Web Component.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentIngressCommon" + }, + { + "$ref": "#/components/schemas/WebIngressCommon" + }, + { + "type": "object", + "properties": { + "client": { + "$ref": "#/components/schemas/ComponentWebIngressClient" + }, + "buffers": { + "$ref": "#/components/schemas/WebIngressBuffersCommon" + } + } + } + ] + }, + "MonitoringCommon": { + "description": "Monitor settings common to Web and TCP/UDP.", + "type": "object", + "properties": { + "defaultState": { + "type": "string", + "enum": [ + "HEALTHY", + "UNHEALTHY" + ], + "default": "HEALTHY" + }, + "interval": { + "type": "integer", + "minimum": 1, + "default": 5 + }, + "consecutiveSuccessThreshold": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "consecutiveFailureThreshold": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "port": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "healthEvents": { + "description": "When enabled, the NGINX Controller Agent generates events related to the\nhealth of the workload group members. Two types of events are generated:\n- An event when the health status of a workload group member changes.\n- A periodic event per component with the health status of all workload groups.\n", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "default": "DISABLED" + } + } + }, + "MonitorAddHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds monitor header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the monitor header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the monitor header.", + "minLength": 1 + } + } + }, + "MonitorDeleteHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes monitor header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the monitor header to modify.", + "minLength": 1 + } + } + }, + "MonitorHeaderModification": { + "type": "object", + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/MonitorAddHeader", + "DELETE": "#/components/schemas/MonitorDeleteHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/MonitorAddHeader" + }, + { + "$ref": "#/components/schemas/MonitorDeleteHeader" + } + ] + }, + "MonitorResponseStatus": { + "type": "object", + "properties": { + "range": { + "type": "object", + "properties": { + "startCode": { + "type": "integer", + "minimum": 100, + "maximum": 599 + }, + "endCode": { + "type": "integer", + "minimum": 100, + "maximum": 599 + } + } + }, + "codes": { + "type": "array", + "items": { + "type": "integer", + "minimum": 100, + "maximum": 599 + } + }, + "match": { + "type": "boolean", + "default": true + } + } + }, + "MonitorResponseContent": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "match": { + "type": "boolean", + "default": true + } + } + }, + "WebMonitorResponse": { + "description": "Settings that define successful responses to a Web monitor.", + "type": "object", + "properties": { + "status": { + "$ref": "#/components/schemas/MonitorResponseStatus" + }, + "headers": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/MonitorResponseContent" + } + }, + "body": { + "$ref": "#/components/schemas/MonitorResponseContent" + } + } + }, + "WebMonitoring": { + "description": "Health monitor settings across all workload groups in a Web Component.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitoringCommon" + }, + { + "type": "object", + "properties": { + "uri": { + "description": "URI containing the relative path that the monitor probe is sent to; the host is specified in the URI in the workload group.", + "type": "string", + "default": "/" + }, + "headerModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MonitorHeaderModification" + } + }, + "response": { + "description": "Settings that define successful responses to a Web monitor.", + "$ref": "#/components/schemas/WebMonitorResponse" + } + } + } + ] + }, + "RoundRobinLB": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ROUND_ROBIN" + ] + } + } + }, + "IPHashLB": { + "type": "object", + "description": "IP Hash Load Balancing only applicable to Web Components.", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IPHASH" + ] + } + } + }, + "LeastConnLB": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "LEAST_CONNECTIONS" + ] + } + } + }, + "HashLBMethod": { + "type": "object", + "required": [ + "type", + "userKey" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "HASH" + ] + }, + "userKey": { + "type": "string" + }, + "consistentHash": { + "$ref": "#/components/schemas/ServiceConfigState" + } + } + }, + "LeastTimeLBMethod": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "LEAST_TIME" + ] + }, + "latencyParameter": { + "type": "string", + "description": "Values applicable to a Web Component are: [HEADER, LAST_BYTE, LAST_BYTE_INFLIGHT];\nValues applicable to a TCP/UDP Component are: [CONNECT, FIRST_BYTE, LAST_BYTE, LAST_BYTE_INFLIGHT].\nThe default value is used for a web Component; there is no default for a TCP/UDP Component.\n", + "enum": [ + "HEADER", + "CONNECT", + "FIRST_BYTE", + "LAST_BYTE", + "LAST_BYTE_INFLIGHT" + ], + "default": "HEADER" + } + } + }, + "RandomLBMethod": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "RANDOM" + ] + }, + "twoServerLBMethod": { + "type": "string", + "description": "Values applicable to a Web Component are: [LEAST_CONNECTIONS, LEAST_TIME_HEADER, LEAST_TIME_LAST_BYTE];\nValues applicable to a TCP/UDP Component are: [LEAST_CONNECTIONS, LEAST_TIME_CONNECT, LEAST_TIME_FIRST_BYTE, LEAST_TIME_LAST_BYTE].\n", + "enum": [ + "LEAST_CONNECTIONS", + "LEAST_TIME_HEADER", + "LEAST_TIME_CONNECT", + "LEAST_TIME_FIRST_BYTE", + "LEAST_TIME_LAST_BYTE" + ] + } + } + }, + "LoadBalancingMethod": { + "discriminator": { + "propertyName": "type", + "mapping": { + "ROUND_ROBIN": "#/components/schemas/RoundRobinLB", + "IPHASH": "#/components/schemas/IPHashLB", + "LEAST_CONNECTIONS": "#/components/schemas/LeastConnLB", + "HASH": "#/components/schemas/HashLBMethod", + "LEAST_TIME": "#/components/schemas/LeastTimeLBMethod", + "RANDOM": "#/components/schemas/RandomLBMethod" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/RoundRobinLB" + }, + { + "$ref": "#/components/schemas/IPHashLB" + }, + { + "$ref": "#/components/schemas/LeastConnLB" + }, + { + "$ref": "#/components/schemas/HashLBMethod" + }, + { + "$ref": "#/components/schemas/LeastTimeLBMethod" + }, + { + "$ref": "#/components/schemas/RandomLBMethod" + } + ] + }, + "DNSServiceDiscovery": { + "required": [ + "servers" + ], + "properties": { + "servers": { + "type": "array", + "description": "Array of DNS servers. Possible options are:\n- An IPv4 address with an optional port number.\n Port 53 is used if not specified.\n For example, \"10.1.1.1\", \"10.1.1.1:5353\".\n- An IPv6 address with an optional port number.\n Port 53 is used if not specified.\n For example, \"[2001::1]\", \"[2001::1]:5353\",\n- Fully qualified domain name (FQDN). ASCII characters only.\n NGINX uses the OS name server configuration\n to identify the IP addresses of the DNS servers to use.\n", + "items": { + "type": "string", + "pattern": "^(?:(?:(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(?::(?:[1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5]))?$)|(?:\\[\\s*(?:(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))|(?:(?:[0-9a-fA-F]{1,4}:){6}(?::[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-fA-F]{1,4}:){5}(?:(?:(?::[0-9a-fA-F]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-fA-F]{1,4}:){4}(?:(?:(?::[0-9a-fA-F]{1,4}){1,3})|(?:(?::[0-9a-fA-F]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){3}(?:(?:(?::[0-9a-fA-F]{1,4}){1,4})|(?:(?::[0-9a-fA-F]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){2}(?:(?:(?::[0-9a-fA-F]{1,4}){1,5})|(?:(?::[0-9a-fA-F]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){1}(?:(?:(?::[0-9a-fA-F]{1,4}){1,6})|(?:(?::[0-9a-fA-F]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-fA-F]{1,4}){1,7})|(?:(?::[0-9a-fA-F]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?](?::(?:[1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5]))?\\s*$)|(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*$))", + "minLength": 1, + "example": "10.1.1.1:5353" + }, + "minItems": 1, + "uniqueItems": true + }, + "ttl": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "description": "Overrides the TTL setting present in the DNS record.", + "example": "10s" + }, + "timeout": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "description": "Sets the timeout for domain name resolution.", + "example": "10s" + } + } + }, + "WorkloadGroupCommon": { + "description": "Settings common to Web and TCP/UDP workloadGroups.", + "type": "object", + "properties": { + "locationRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "loadBalancingMethod": { + "$ref": "#/components/schemas/LoadBalancingMethod" + }, + "dnsServiceDiscovery": { + "$ref": "#/components/schemas/DNSServiceDiscovery" + } + } + }, + "WebProxy": { + "description": "Proxy retry and timeout settings applicable to servers in a Web workloadGroup associated with a Component.", + "type": "object", + "properties": { + "nextUpstream": { + "description": "Specifies in which cases a request should be passed to the next server.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "ERROR", + "TIMEOUT", + "INVALID_HEADER", + "HTTP_500", + "HTTP_502", + "HTTP_503", + "HTTP_504", + "HTTP_403", + "HTTP_404", + "HTTP_429", + "NON_IDEMPOTENT", + "OFF" + ] + } + }, + "connectTimeout": { + "description": "Defines a timeout for establishing a connection with a proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + }, + "sendTimeout": { + "description": "Sets a timeout for transmitting a request to the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + } + } + }, + "SessionPersistenceCookie": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "COOKIE" + ] + }, + "srvID": { + "type": "string" + }, + "expireTime": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "domain": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "SessionPersistenceRoute": { + "type": "object", + "required": [ + "type", + "routeInfoLocation" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ROUTE" + ] + }, + "routeInfoLocation": { + "type": "string", + "enum": [ + "COOKIE", + "URI", + "BOTH" + ] + } + } + }, + "SessionPersistenceCookieLearn": { + "type": "object", + "required": [ + "type", + "create", + "lookup" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "COOKIE_LEARN" + ] + }, + "create": { + "type": "string", + "pattern": "^\\$.+" + }, + "lookup": { + "type": "string", + "pattern": "^\\$.+" + } + } + }, + "SessionPersistence": { + "description": "SessionPersistence settings in a Web workloadGroup.", + "discriminator": { + "propertyName": "type", + "mapping": { + "COOKIE": "#/components/schemas/SessionPersistenceCookie", + "ROUTE": "#/components/schemas/SessionPersistenceRoute", + "COOKIE_LEARN": "#/components/schemas/SessionPersistenceCookieLearn" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SessionPersistenceCookie" + }, + { + "$ref": "#/components/schemas/SessionPersistenceRoute" + }, + { + "$ref": "#/components/schemas/SessionPersistenceCookieLearn" + } + ] + }, + "WorkloadUri": { + "type": "object", + "properties": { + "weight": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "maxConns": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "maxFails": { + "type": "integer", + "minimum": 0, + "default": 1 + }, + "failTimeout": { + "x-f5-experimental": true, + "type": "string", + "default": "10s", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "isBackup": { + "type": "boolean", + "default": false + }, + "isDown": { + "type": "boolean", + "default": false + }, + "route": { + "x-f5-experimental": true, + "type": "string" + }, + "srvService": { + "type": "string" + }, + "slowStart": { + "x-f5-experimental": true, + "type": "integer", + "minimum": 0, + "default": 0 + }, + "isDrain": { + "type": "boolean", + "default": false + } + } + }, + "WebWorkloadGroup": { + "description": "Group of servers hosting a part of a Web application represented by a Component.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkloadGroupCommon" + }, + { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/components/schemas/WebProxy" + }, + "sessionPersistence": { + "$ref": "#/components/schemas/SessionPersistence" + }, + "uris": { + "type": "object", + "description": "The URI for a server hosting a part of a Web application.\n\nIt must conform to the format `schema://address[:port]`\nwhere schema is chosen from http or https, address is IP or hostname,\nschema and address must be provided.\n\nFor example:\n\n- `http://192.0.2.247`\n- `https://192.0.2.247:8443`\n- `https://www.f5workload.com`\n", + "additionalProperties": { + "$ref": "#/components/schemas/WorkloadUri" + } + } + } + } + ] + }, + "BackendBuffers": { + "description": "Proxy buffer settings applicable to servers across all Web workloadGroups associated with a Component.", + "type": "object", + "properties": { + "headerSize": { + "description": "Sets the size of the buffer used for reading the first part of the response received from the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size" + } + }, + "isEnabled": { + "description": "Enables or disables buffering of responses from the proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering" + } + }, + "size": { + "description": "Sets the number and size of the buffers used for reading a response from the proxied server, for a single connection.", + "type": "object", + "properties": { + "number": { + "type": "integer" + }, + "size": { + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$" + } + }, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers" + } + }, + "busySize": { + "description": "When buffering of responses from the proxied server is enabled, it limits the total size of buffers that can be busy sending a response to the client while the response is not yet fully read.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_busy_buffers_size" + } + }, + "ignoreClientAbort": { + "description": "Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort" + } + }, + "forceRanges": { + "description": "Enables byte-range support for both cached and uncached responses from the proxied server regardless of the \"Accept-Ranges\" field in these responses.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_force_ranges" + } + }, + "httpVersion": { + "description": "This field is deprecated. Use 'Backend.httpVersion' to set the desired HTTP Version.", + "type": "string", + "enum": [ + "1.0", + "1.1" + ], + "deprecated": true, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version" + } + }, + "rate": { + "description": "Limits the speed (in bytes per second) of reading the response from the proxied server.\nDisables rate limiting when set to `0`.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_limit_rate" + } + }, + "readTimeout": { + "description": "Defines a timeout for reading a response from the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout" + } + }, + "maxTempFileSize": { + "description": "Sets the maximum size of the temporary file that the response can be saved into. Note that the buffering of responses from proxied server is enabled and the response does not fit into the buffers.\n\nDisables temporary file usage when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size" + } + }, + "tempFileWriteSize": { + "description": "Limits the size of data written to a temporary file at a time, when buffering of responses from the proxied server to temporary files is enabled.\n\nDisables temporary file usage when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_file_write_size" + } + } + } + }, + "WebBackend": { + "description": "Backend settings in a Web Component.\n", + "type": "object", + "properties": { + "keepAlive": { + "type": "object", + "properties": { + "connections": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "requestsPerConn": { + "type": "integer" + }, + "idleTimeout": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "example": "1h" + } + } + }, + "monitoring": { + "$ref": "#/components/schemas/WebMonitoring" + }, + "workloadGroups": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/WebWorkloadGroup" + } + }, + "preserveHostHeader": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "queue": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "length" + ], + "properties": { + "length": { + "type": "integer" + }, + "timeOut": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "example": "1h" + } + } + }, + "httpVersion": { + "description": "Sets the HTTP protocol version for proxying.", + "type": "string", + "pattern": "^[1-3]{1}\\.[0-1]{1}$", + "example": 1 + }, + "ntlmAuthentication": { + "description": "Allows proxying requests with NTLM Authentication.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ntlm" + } + }, + "persistentState": { + "x-f5-experimental": true, + "type": "string" + }, + "buffers": { + "$ref": "#/components/schemas/BackendBuffers" + }, + "isSocketKeepaliveEnabled": { + "description": "Configures the “TCP keepalive” behavior for outgoing connections to a proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_socket_keepalive" + } + }, + "ignoreHeaders": { + "description": "Disables processing of certain response header fields from the proxied server.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "X-Accel-Redirect", + "X-Accel-Expires", + "X-Accel-Limit-Rate", + "X-Accel-Buffering", + "X-Accel-Charset", + "Expires", + "Cache-Control", + "Set-Cookie", + "Vary" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers" + } + }, + "debugHeaders": { + "description": "Permits passing otherwise disabled header fields from a proxied server to a client.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "X-Accel-Redirect", + "X-Accel-Expires", + "X-Accel-Limit-Rate", + "X-Accel-Buffering", + "X-Accel-Charset", + "Expires", + "Cache-Control", + "Set-Cookie", + "Vary" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_header" + } + }, + "tls": { + "description": "TLS settings applicable to servers in Web workloadGroups.", + "type": "object", + "properties": { + "cipher": { + "description": "Specifies the enabled ciphers for requests to a proxied HTTPS server.", + "type": "string", + "example": "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_ciphers" + } + }, + "name": { + "description": "Allows overriding the server name used to verify the certificate of the proxied HTTPS server.", + "type": "string", + "example": "$proxy_host", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_name" + } + }, + "protocols": { + "description": "Enables the specified protocols for requests to a proxied HTTPS server.", + "type": "array", + "items": { + "type": "string", + "pattern": "TLSv1|TLSv1\\.[1-3]|SSLv2|SSLv3" + }, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_protocols" + } + }, + "isServerNameEnabled": { + "description": "Enables or disables passing of the server name through TLS Server Name Indication extension (SNI, RFC 6066) when establishing a connection with the proxied HTTPS server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name" + } + }, + "isSessionReuseEnabled": { + "description": "Determines whether SSL sessions can be reused when working with the proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_session_reuse" + } + }, + "isVerifiedEnabled": { + "description": "Enables or disables verification of the proxied HTTPS server certificate.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify" + } + }, + "verifyDepth": { + "description": "Sets the verification depth in the proxied HTTPS server certificates chain.", + "type": "integer", + "minimum": 0, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify_depth" + } + } + } + } + } + }, + "UriRewrite": { + "type": "object", + "required": [ + "incomingPattern", + "rewritePattern" + ], + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + }, + "incomingPattern": { + "type": "string", + "description": "The regex pattern to match against the request URIs that are expected to be rewritten." + }, + "rewritePattern": { + "type": "string", + "description": "The replacement regex pattern to apply to the URIs that are to be rewritten.", + "minLength": 1 + }, + "afterExecute": { + "type": "string", + "enum": [ + "NONE", + "LAST", + "BREAK", + "REDIRECT", + "PERMANENT" + ], + "default": "BREAK" + } + } + }, + "UriRedirect": { + "type": "object", + "required": [ + "responseCode" + ], + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + }, + "responseCode": { + "type": "integer", + "minimum": 300, + "maximum": 308 + }, + "url": { + "type": "string", + "minLength": 1, + "description": "The return url to use for responses in the 301-308 range." + }, + "text": { + "type": "string", + "description": "The return text to send for 300 responses." + } + } + }, + "ProgrammabilityAction": { + "type": "string", + "enum": [ + "ADD", + "MODIFY", + "DELETE" + ] + }, + "CookieModification": { + "type": "object", + "required": [ + "action", + "cookieName" + ], + "properties": { + "action": { + "$ref": "#/components/schemas/ProgrammabilityAction" + }, + "cookieName": { + "type": "string" + }, + "cookieValue": { + "type": "string" + } + } + }, + "ProgrammabilityAddRequestHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds request header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the request header.", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ProgrammabilityDeleteRequestHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes request header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the request header to modify.", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "RequestHeaderModification": { + "type": "object", + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/ProgrammabilityAddRequestHeader", + "DELETE": "#/components/schemas/ProgrammabilityDeleteRequestHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ProgrammabilityAddRequestHeader" + }, + { + "$ref": "#/components/schemas/ProgrammabilityDeleteRequestHeader" + } + ] + }, + "ProgrammabilityAddResponseHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds response header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the response header.", + "minLength": 1 + }, + "responseCodeFilter": { + "type": "string", + "description": "The value to apply to the response code filter.", + "enum": [ + "ALWAYS", + "PRE_DEFINED" + ], + "default": "PRE_DEFINED" + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ProgrammabilityDeleteResponseHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes response header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.\n\n> Warning: `Date`, `Content-Length`, and `Connection` headers cannot be deleted.\n", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ResponseHeaderModification": { + "type": "object", + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/ProgrammabilityAddResponseHeader", + "DELETE": "#/components/schemas/ProgrammabilityDeleteResponseHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ProgrammabilityAddResponseHeader" + }, + { + "$ref": "#/components/schemas/ProgrammabilityDeleteResponseHeader" + } + ] + }, + "Programmability": { + "type": "object", + "properties": { + "uriRewrites": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UriRewrite" + } + }, + "httpHttpsRedirect": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "uriRedirects": { + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/UriRedirect" + } + }, + "cookieModifications": { + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/CookieModification" + } + }, + "requestHeaderModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RequestHeaderModification" + } + }, + "responseHeaderModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResponseHeaderModification" + } + } + } + }, + "Logging": { + "description": "Settings for error logs and access logs.", + "type": "object", + "properties": { + "errorLog": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "accessLog": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "format": { + "type": "string" + } + } + } + } + }, + "WAF": { + "description": "Defines the desired configurations for the WAF associated with the application component.", + "properties": { + "isEnabled": { + "type": "boolean", + "default": true, + "description": "Indicates whether the WAF is enabled or not." + }, + "isMonitorOnly": { + "type": "boolean", + "default": true, + "description": "Indicates whether the WAF will monitor or block security violations." + }, + "signatureOverrides": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "IGNORE" + ] + } + }, + "description": "Identifies overrides for the signatures contained within the associated security strategy.\n", + "example": { + "1234": { + "action": "IGNORE" + }, + "1235": { + "action": "IGNORE" + } + } + } + } + } + }, + "APIKeyClientAuth": { + "description": "Defines how an API client should provide their API Key credentials.", + "required": [ + "keyLocation" + ], + "properties": { + "keyLocation": { + "type": "string", + "enum": [ + "HEADER", + "QUERY_PARAM" + ] + }, + "key": { + "type": "string" + } + } + }, + "JWTClientAuth": { + "description": "Defines how an API Client should provide their JWT.", + "required": [ + "keyLocation" + ], + "properties": { + "keyLocation": { + "type": "string", + "enum": [ + "BEARER", + "HEADER", + "QUERY_PARAM", + "COOKIE" + ] + }, + "key": { + "type": "string" + } + } + }, + "ConditionalAuthPolicy": { + "description": "Defines further fine-grained access control on top of API Key or JWT Auth.", + "required": [ + "sourceType", + "comparisonType", + "comparisonValues", + "action", + "denyStatusCode" + ], + "properties": { + "sourceType": { + "type": "string", + "enum": [ + "HEADER", + "JWT_CLAIM" + ] + }, + "sourceKey": { + "type": "string" + }, + "comparisonType": { + "type": "string", + "enum": [ + "EQUALS", + "NOT_EQUALS", + "IN", + "CONTAINS" + ] + }, + "comparisonValues": { + "type": "array", + "description": "Valid values for the sourceType.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + } + }, + "action": { + "type": "string", + "enum": [ + "ALLOW", + "DENY" + ] + }, + "denyStatusCode": { + "type": "integer" + } + } + }, + "RateLimit": { + "required": [ + "rate" + ], + "properties": { + "rate": { + "type": "string", + "pattern": "^[0-9]+r\\/[m|s]{1}$", + "description": "Sets the maximum number of allowed requests.\n\nYou can specify the rate limit as requests per second (r/s) or requests per minute (r/m).\n", + "example": "10r/s" + }, + "burstBeforeReject": { + "type": "integer", + "minimum": 0 + }, + "burstBeforeDelay": { + "type": "integer", + "minimum": 0 + }, + "statusCode": { + "type": "integer", + "default": 429 + }, + "key": { + "type": "string", + "default": "$binary_remote_addr", + "description": "Parameters (NGINX variable) for a shared memory zone that stores states for various keys; used for `limit_req_zone`." + } + } + }, + "Security": { + "type": "object", + "description": "Defines the desired security configurations for the application component.", + "properties": { + "strategyRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "waf": { + "$ref": "#/components/schemas/WAF" + }, + "identityProviderRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + }, + "description": "The list of Identity Providers that are used in this Security policy." + }, + "apiKeyClientAuth": { + "$ref": "#/components/schemas/APIKeyClientAuth" + }, + "jwtClientAuth": { + "$ref": "#/components/schemas/JWTClientAuth" + }, + "conditionalAuthPolicies": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ConditionalAuthPolicy" + } + }, + "rateLimits": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/RateLimit" + } + }, + "interceptWorkloadErrors": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + } + } + }, + "InstanceGroupRef": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + }, + { + "type": "object", + "properties": { + "listenIps": { + "description": "The list of Listen IP addresses.\nSets the BIG-IP virtual address(es) on which the server listens for and accepts requests.\n", + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$", + "example": "1.1.1.1" + } + } + } + } + ] + }, + "Placement": { + "description": "Instances that have NGINX configuration applied corresponding to the Gateway and associated Components settings.", + "type": "object", + "properties": { + "instanceRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceRef" + } + }, + "instanceGroupRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroupRef" + } + } + } + }, + "GatewayIngressCommon": { + "description": "Ingress settings in a Gateway that apply to Web and TCP/UDP Components.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewaySocketSettings" + }, + { + "type": "object", + "required": [ + "uris", + "placement" + ], + "properties": { + "uris": { + "$ref": "#/components/schemas/IngressUris" + }, + "tls": { + "$ref": "#/components/schemas/TLS" + }, + "placement": { + "$ref": "#/components/schemas/Placement" + } + } + } + ] + }, + "HeaderMatchMethod": { + "type": "string", + "enum": [ + "PREFIX", + "REGEX", + "REGEX_CASE_SENSITIVE", + "SUFFIX", + "EXACT" + ], + "default": "REGEX" + }, + "IngressHeader": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "nameMatchMethod": { + "$ref": "#/components/schemas/HeaderMatchMethod" + }, + "value": { + "type": "string" + }, + "valueMatchMethod": { + "$ref": "#/components/schemas/HeaderMatchMethod" + } + } + }, + "WebIngressCommon": { + "description": "Ingress settings in a Gateway and Component that apply only to Web Components.", + "type": "object", + "properties": { + "methods": { + "description": "Specifies the HTTP method to use in requests.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "POST", + "GET", + "PUT", + "DELETE", + "PATCH", + "HEAD", + "TRACE", + "OPTIONS", + "CONNECT" + ] + } + }, + "clientMaxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.", + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$", + "deprecated": true, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + }, + "headers": { + "description": "Specifies the match method for headers to be used in requests.", + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/IngressHeader" + } + }, + "http2": { + "description": "Enable or disable HTTP/2 connections on the port. Normally, for this to work the `ssl` parameter should be specified as well,\nbut NGINX can also be configured to accept HTTP/2 connections without SSL.\nPossible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "spdy": { + "description": "Enables or disables acceptance of the SPDY connections on the specified port.\nNormally, for this to work the `ssl` parameter should be specified as well,\nbut NGINX can also be configured to accept SPDY connections without SSL. Possible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "proxyProtocol": { + "description": "Enables or disables the proxy protocol for all connections accepted on the specified port.\nThe `proxy protocol` enables NGINX and NGINX Plus to receive client connection information passed through proxy servers and load balancers,\nsuch as HAproxy and Amazon Elastic Load Balancer (ELB). The possible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "notFoundStatusCode": { + "x-f5-experimental": true, + "type": "integer", + "default": 404 + }, + "headersHashBucketSize": { + "description": "Sets the bucket size for hash tables used by the `proxy_hide_header` and `proxy_set_header` directives.", + "type": "integer", + "minimum": 1, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_bucket_size" + } + }, + "headersHashMaxSize": { + "description": "Sets the maximum size of hash tables used by the `proxy_hide_header` and `proxy_set_header` directives.", + "type": "integer", + "minimum": 1, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_max_size" + } + } + } + }, + "GatewayWebIngressClient": { + "description": "Non-buffer settings in a Gateway applicable to Web client requests.", + "type": "object", + "properties": { + "bodyInFileOnly": { + "description": "Determines whether NGINX Controller should save the entire client request body into a file.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED", + "CLEAN" + ], + "default": "DISABLED", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only" + } + }, + "bodyTimeout": { + "description": "Defines a timeout for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout" + } + }, + "headerTimeout": { + "description": "Defines a timeout for reading the client request header.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout" + } + }, + "maxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.\n\nDisables checking of client request body size when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + } + } + }, + "WebIngressBuffersCommon": { + "description": "Buffer settings common to a Gateway and Component applicable to web client requests.", + "type": "object", + "properties": { + "clientBodyBufferingIsEnabled": { + "description": "Enables or disables buffering of a client request body.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering" + } + }, + "clientBodyBufferSize": { + "description": "Sets the buffer size for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size" + } + }, + "clientBodyInSingleBuffer": { + "description": "Determines whether NGINX Controller should save the entire client request body in a single buffer.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_single_buffer" + } + } + } + }, + "GatewayWebIngress": { + "description": "Ingress settings in a Gateway that apply only to Web Components.", + "type": "object", + "properties": { + "client": { + "$ref": "#/components/schemas/GatewayWebIngressClient" + }, + "allowUnderscoresInHeaders": { + "type": "boolean", + "default": false, + "description": "Allows the use of underscores in client request header fields.\n\nWhen set to `disabled`, request headers with names that contain underscores are considered invalid and are ignored.\n" + }, + "buffers": { + "allOf": [ + { + "$ref": "#/components/schemas/WebIngressBuffersCommon" + }, + { + "type": "object", + "properties": { + "clientHeaderBufferSize": { + "description": "Sets the buffer size for reading the client request header.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_buffer_size" + } + } + } + } + ] + } + } + }, + "GatewayIngress": { + "description": "Ingress settings in a Gateway.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayIngressCommon" + }, + { + "$ref": "#/components/schemas/WebIngressCommon" + }, + { + "$ref": "#/components/schemas/GatewayWebIngress" + } + ] + }, + "GatewayDesiredState": { + "description": "The desired gateway settings that the user wants in the configuration on NGINX instances referenced by this Gateway.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayWebState" + }, + { + "$ref": "#/components/schemas/GatewayStateCommon" + }, + { + "type": "object", + "required": [ + "ingress" + ], + "properties": { + "ingress": { + "$ref": "#/components/schemas/GatewayIngress" + } + } + } + ] + }, + "CertMetadata": { + "type": "object", + "description": "Public certificate metadata.", + "required": [ + "authorityKeyIdentifier", + "commonName", + "expired", + "expiry", + "issuer", + "publicKeyType", + "serialNumber", + "signatureAlgorithm", + "subject", + "subjectAlternativeName", + "subjectKeyIdentifier", + "thumbprint", + "thumbprintAlgorithm", + "validFrom", + "validTo", + "version" + ], + "properties": { + "authorityKeyIdentifier": { + "type": "string", + "example": "2B D0 69 47 94 76 09 FE F4 6B 8D 2E 40 A6 F7 47 4D 7F 08 5E", + "description": "The identifier of the signing authority for the certificate." + }, + "commonName": { + "type": "string", + "example": "www.myapp.com", + "description": "The Common Name (CN) for the certificate. This is typically a Fully Qualified Domain Name (FQDN), and must be the same as the web address users access when connecting to a web site." + }, + "expired": { + "type": "boolean", + "example": false, + "description": "Indicates the expiration status of the certificate." + }, + "expiry": { + "type": "integer", + "example": 35500034, + "description": "The number of seconds until the certificate will expire." + }, + "issuer": { + "type": "string", + "example": "DigiCert Class 3 Extended Validation SSL SGC CA.", + "description": "Identifies the entity who signed and issued the certificate." + }, + "publicKeyType": { + "type": "string", + "example": "RSA (2048 Bits)", + "description": "Identifies the encryption algorithm used to create the public key for the ceritficate." + }, + "serialNumber": { + "type": "string", + "example": "16469416336579571270", + "description": "A unique identifier for the certificate." + }, + "signatureAlgorithm": { + "type": "string", + "example": "SHA-256", + "description": "Identifies the algorithm used to sign the certificate." + }, + "subject": { + "type": "string", + "example": "www.myapp.com", + "description": "Contains the Distinguished Name (DN) information for the certificate." + }, + "subjectAlternativeName": { + "type": "string", + "example": "DNS Name=static.xxxx", + "description": "Defines additional identifies bound to the subject of the certificate. For example, the DNS name is used to add addtional domain names to a certificate." + }, + "subjectKeyIdentifier": { + "type": "string", + "example": "31 EA 76 A9 23 74 A5 DF D4 FD EE A0 C1 A6 9E C6 11 0E 11 EC", + "description": "A hash value of the SSL certificate that can be used to identify certificates that contain a particular public key." + }, + "thumbprint": { + "type": "string", + "example": "E6 A7 87 96 E0 C7 A3 E5 43 78 35 CA 16 78 5B 48 5A A9 DD C4 5C CD 0A 65 AA 89 33 E3 C3 D0 89 71", + "description": "A hash to ensure that the certificate has not been modified." + }, + "thumbprintAlgorithm": { + "type": "string", + "example": "SHA-1", + "description": "Defines the algorithm used to hash the certificate." + }, + "validFrom": { + "type": "string", + "example": "2019-07-29T09:12:33.001Z", + "description": "The start of the validity period for the certificate." + }, + "validTo": { + "type": "string", + "example": "2029-07-29T09:12:33.001Z", + "description": "The end of the validity period for the certificate." + }, + "version": { + "type": "integer", + "example": 3, + "description": "The version of the certificate, typically 3 for X.509 certificates." + } + } + }, + "CertDesiredState": { + "type": "object", + "discriminator": { + "propertyName": "type", + "mapping": { + "PEM": "#/components/schemas/PEM", + "PKCS12": "#/components/schemas/PKCS12", + "REMOTE_FILE": "#/components/schemas/RemoteFile" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/PEM" + }, + { + "$ref": "#/components/schemas/PKCS12" + }, + { + "$ref": "#/components/schemas/RemoteFile" + } + ] + }, + "CertList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "CertStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/CertDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/CertCurrentStatus" + } + } + }, + "CertCurrentStatus": { + "type": "object", + "description": "'Shows the current status of the certificate.\n\nWhen any certificates have expired, the Certs service sets `state.selfConfigState.isConfigured` and `state.selfConfigState.isError` to `true`. The service will also add a value to the conditons array with the type \"expiration\" and a message that shows when the first certificate will expire. For example, `conditions: [{type: \"expiration\", message: \"Certificate www.example.com will expire in 29 days.\"}])`'\n", + "required": [ + "state", + "certMetadata", + "type" + ], + "properties": { + "type": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "publicCert": { + "type": "string" + }, + "data": { + "type": "string" + }, + "password": { + "type": "string" + }, + "caCerts": { + "type": "array", + "items": { + "type": "string" + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "certMetadata": { + "type": "array", + "description": "Public certificate metadata.", + "items": { + "$ref": "#/components/schemas/CertMetadata" + } + } + } + }, + "Cert": { + "type": "object", + "description": "Contains the certificate to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/CertDesiredState" + } + } + }, + "PEM": { + "type": "object", + "description": "Defines a PEM-formatted certificate that contains a key and certificates.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\nThe private key data will be redacted in the response for all get and list requests.\n", + "required": [ + "privateKey", + "publicCert", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PEM" + ] + }, + "password": { + "type": "string", + "example": "myPa$$w0rd", + "description": "The passphrase to use to decrypt the private key. Required if the private key is encrypted." + }, + "privateKey": { + "type": "string", + "example": "-----BEGIN PRIVATE KEY-----\\n MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALSQBtRafNJtTqN0\\n nYiZq6TZUsHjfG2R9PlK6jsvno9O6amN96Al6ZSTTDjhr4VU7/RJ0p/cisiCboCX\\n 4cCq6lFKpIpeZJI=\\n -----END PRIVATE KEY-----", + "description": "The private key used to sign the public certificate.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`). The private key data will be redacted in the response for all get and list requests.\n" + }, + "publicCert": { + "type": "string", + "example": "-----BEGIN CERTIFICATE-----\\n MIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\n MiJVGawyxDzBm2UhzNOE0ABHfjAgM6PAYmtMhhQawk6bmttXYhJeqhLSji4LEj5d\\n Z4FmXQ5rWM0RWBs=\\n -----END CERTIFICATE-----", + "description": "The end-entity certificate, in PEM format.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n" + }, + "caCerts": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "-----BEGIN CERTIFICATE-----\\n MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh\\n WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf\\n SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==\\n -----END CERTIFICATE-----" + ], + "description": "An optional list of intermediate certificates in PEM format that are used to validate the public certificate.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n" + } + } + }, + "PKCS12": { + "type": "object", + "description": "Defines a cert with key and certificates encoded in PKCS12 format.", + "required": [ + "data", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PKCS12" + ] + }, + "data": { + "type": "string", + "example": "MIIGoQIBAzCCBmcGCSqGSIb3DQEHAaCCBlgEggZUMIIGUDCCA08GCSqGSIb3DQEHBqCCA0AwggM8AgEAMIIDNQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIe7ZblBoEW3QCAggAgIIDCCgLEvzp9n69QbpGT0MDEwITAJBgUrDgMCGgUABBQJs6ZgeAMcxVLrq1hU+TlUOArMuQQIGK59vCBn0wECAggA", + "description": "A base-64-encoded string that contains a private key, a public certificate, and, optionally, other intermediate certificates." + }, + "password": { + "type": "string", + "example": "myPa$$w0rd", + "description": "The password to use to decrypt PKCS12 data." + } + } + }, + "RemoteFile": { + "type": "object", + "description": "Define a Cert resource by providing references to remote files.\n\n> **Note:** These are file path references only. The system can not validate the file contents or extract the certificate metadata. Providing a PEM or PKCS12 certificate is recommended.\n", + "required": [ + "privateKey", + "publicCert", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "REMOTE_FILE" + ] + }, + "privateKey": { + "type": "string", + "example": "/certs/www.example.com/example.key", + "description": "The path to the private key file." + }, + "publicCert": { + "type": "string", + "example": "/certs/www.example.com/example.crt", + "description": "The path to the certificate bundle file. The file must contain the public certificate and may contain additional intermediate certificates." + } + } + }, + "IdentityProviderList": { + "type": "object", + "description": "Contains a list of Identity Provider resources.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "APIKeyIdentityProvider": { + "required": [ + "type" + ], + "type": "object", + "description": "Use an API key for authentication.\n\n> **Note:** Use of API Key authN is not recommended in production environments.\n", + "properties": { + "type": { + "type": "string", + "enum": [ + "API_KEY" + ] + } + } + }, + "JWTIdentityProvider": { + "required": [ + "jwkFile", + "type" + ], + "type": "object", + "description": "Use a JWT for authentication.", + "properties": { + "type": { + "type": "string", + "enum": [ + "JWT" + ] + }, + "jwkFile": { + "description": "Provide the path to - or URI for - a `.jwk` file to use for authentication.\nYou can also provide the `.jwk` file contents inline.\n", + "discriminator": { + "propertyName": "type", + "mapping": { + "INLINE": "#/components/schemas/JWKInline", + "REMOTE_FILE": "#/components/schemas/JWKRemoteFile" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/JWKInline" + }, + { + "$ref": "#/components/schemas/JWKRemoteFile" + } + ] + } + } + }, + "IdentityProviderDesiredState": { + "required": [ + "environmentRefs", + "identityProvider" + ], + "type": "object", + "properties": { + "environmentRefs": { + "description": "The Enviroment associated with the Identity Provider.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "identityProvider": { + "$ref": "#/components/schemas/IdentityProviderData" + } + }, + "example": { + "environmentRefs": [ + { + "ref": "/services/environments/env1" + } + ], + "identityProvider": { + "type": "JWT", + "jwkFile": { + "type": "REMOTE_FILE", + "uri": "https://example.com/keys.jwk", + "cacheExpire": "10h" + } + } + } + }, + "IdentityProviderCurrentStatus": { + "required": [ + "environmentRefs", + "identityProvider", + "state" + ], + "type": "object", + "properties": { + "environmentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "identityProvider": { + "$ref": "#/components/schemas/IdentityProviderData" + } + } + }, + "IdentityProvider": { + "required": [ + "desiredState", + "metadata" + ], + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderDesiredState" + } + } + }, + "IdentityProviderData": { + "description": "The means of authentication used by the Identity Provider (JWT or APIKey).", + "oneOf": [ + { + "$ref": "#/components/schemas/JWTIdentityProvider" + }, + { + "$ref": "#/components/schemas/APIKeyIdentityProvider" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "API_KEY": "#/components/schemas/APIKeyIdentityProvider", + "JWT": "#/components/schemas/JWTIdentityProvider" + } + } + }, + "IdentityProviderClientDesiredState": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/IdentityProviderClientCredential" + } + } + }, + "IdentityProviderClientCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "credential": { + "$ref": "#/components/schemas/IdentityProviderClientCredential" + } + } + }, + "IdentityProviderClient": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderClientCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderClientDesiredState" + } + } + }, + "IdentityProviderClientCredential": { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityProviderAPIKey" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "API_KEY": "#/components/schemas/IdentityProviderAPIKey" + } + } + }, + "IdentityProviderClientList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "UpdateIdentityProviderClient": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderClientCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderClientDesiredState" + } + } + }, + "JWK": { + "type": "object", + "properties": { + "kty": { + "type": "string", + "description": "The cryptographic algorithm family used with the key, such as \"RSA\" or \"EC\"." + }, + "use": { + "type": "string", + "description": "The intended use of the public key, whether for encrypting data or verifying the signature on data." + }, + "key_ops": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The operation(s) for which the key is intended to be used." + }, + "alg": { + "type": "string", + "description": "The algorithm intended for use with the key." + }, + "kid": { + "type": "string", + "description": "The key ID used to match a specific key." + }, + "x5u": { + "type": "string", + "description": "The X.509 URL that refers to a resource for an X.509 public key certificate or certificate chain." + }, + "x5c": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The X.509 Certificate Chain of one or more PKIX certificates. The PKIX certificate containing the key value MUST be the first certificate." + }, + "x5t": { + "type": "string", + "description": "The X.509 Certificate SHA-1 Thumbprint (a.k.a. digest) of the DER encoding of an X.509 certificate." + }, + "x5t256": { + "type": "string", + "description": "The X.509 Certificate SHA-256 Thumbprint (a.k.a. digest) of the DER encoding of an X.509 certificate." + }, + "p2s": { + "type": "string", + "description": "The salt input value for PBES2 key encryption, which is used as part of the PBKDF2 salt value." + }, + "p2c": { + "type": "string", + "description": "The PBKDF2 iteration count for PBES2 key encryption, represented as a positive JSON integer. The iteration count adds computational expense, ideally compounded by the possible range of keys introduced by the salt. A minimum iteration count of 1000 is RECOMMENDED." + }, + "crv": { + "type": "string", + "description": "The cryptographic curve used for an Elliptic Curve public key." + }, + "x": { + "type": "string", + "description": "The x coordinate of the point for an Elliptic Curve public key." + }, + "y": { + "type": "string", + "description": "The y coordinate of the point for an Elliptic Curve public key." + }, + "e": { + "type": "string", + "description": "The exponent value for an RSA public key." + }, + "exp": { + "type": "string", + "description": "The exponent value for an RSA public key." + }, + "n": { + "type": "string", + "description": "The modulus value for an RSA public key." + }, + "mod": { + "type": "string", + "description": "The modulus value for an RSA public key." + }, + "d": { + "type": "string", + "description": "The private key value for an Elliptic Curve private key OR the private exponent value for an RSA private key." + }, + "p": { + "type": "string", + "description": "The first prime factor for an RSA private key." + }, + "q": { + "type": "string", + "description": "The second prime factor for an RSA private key." + }, + "dp": { + "type": "string", + "description": "The Chinese Remainder Theorem (CRT) exponent of the first factor for an RSA private key." + }, + "dq": { + "type": "string", + "description": "The CRT exponent of the second factor for an RSA private key." + }, + "qi": { + "type": "string", + "description": "The CRT coefficient of the second factor for an RSA private key." + }, + "oth": { + "description": "An array of information about any third and subsequent primes, should they exist.", + "type": "array", + "items": { + "type": "object", + "properties": { + "r": { + "type": "string", + "description": "The prime factor." + }, + "d": { + "type": "string", + "description": "The factor CRT exponent of the corresponding prime factor." + }, + "t": { + "type": "string", + "description": "The factor CRT coefficient of the corresponding prime factor." + } + } + } + }, + "iv": { + "type": "string", + "description": "The base64url-encoded representation of the 96-bit Initialization Vector value used for the AES GCM key encryption operation." + }, + "tag": { + "type": "string", + "description": "The base64url-encoded representation of the 128-bit Authentication Tag value resulting from the AES GCM key encryption operation." + }, + "k": { + "type": "string", + "description": "The key value of the symmetric (or other single-valued) key." + }, + "enc": { + "type": "string", + "description": "The encryption algorithm for JWE." + }, + "epk": { + "type": "object", + "description": "The ephemeral public key value created by the originator for use in ECDH-ES key agreement algorithms." + }, + "apu": { + "type": "string", + "description": "The agreement PartyUInfo for ECDH-ES key agreement algorithms, containing information about the producer." + }, + "apv": { + "type": "string", + "description": "The agreement PartyVInfo for ECDH-ES key agreement algorithms." + } + } + }, + "JWKInline": { + "required": [ + "type", + "keys" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "INLINE" + ] + }, + "keys": { + "type": "array", + "description": "The JSON Web Keys.\n", + "items": { + "$ref": "#/components/schemas/JWK" + }, + "example": [ + { + "k": "ZmFudGFzdGljand0", + "kty": "oct", + "kid": 1 + } + ] + } + }, + "description": "Inline contents of a JWK JSON file.\n" + }, + "JWKRemoteFile": { + "required": [ + "uri", + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "REMOTE_FILE" + ] + }, + "uri": { + "type": "string" + }, + "cacheExpire": { + "pattern": "^[0-9]+[h|m|s]{1}$", + "type": "string", + "description": "The length of time for which to cache the remote file.\nNGINX will retrieve the file from the source URI when the cache time expires.\n", + "example": "10h" + } + } + }, + "IdentityProviderAPIKey": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "API_KEY" + ] + }, + "apiKey": { + "type": "string", + "description": "If left empty, a key will automatically be generated.\nThe apikey must contain only alphanumeric characters, underscores, and hyphens.\nThe length of the apikey must be between 8 - 256 characters.\n", + "example": "ADv-2ZheQnL_jVx5klhQ39" + } + } + }, + "ListInstanceGroupsResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + } + }, + "GetInstanceGroupResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/InstanceGroup" + } + ] + }, + "InstanceGroup": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceGroupState" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceGroupStatus" + } + } + }, + "InstanceGroupState": { + "type": "object", + "properties": { + "bigIpIntegration": { + "$ref": "#/components/schemas/BigIpIntegration" + }, + "locationRef": { + "description": "Reference to location all instances of the group belong to. If not specified, the default 'unspecified' is assumed.", + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "InstanceGroupStatus": { + "type": "object", + "required": [ + "state" + ], + "properties": { + "instanceRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceRef" + } + }, + "bigIpIntegration": { + "$ref": "#/components/schemas/BigIpIntegration" + }, + "locationRef": { + "description": "Reference to location all instances of the group belong to. If not specified, the default 'unspecified' is assumed.", + "$ref": "#/components/schemas/ResourceRef" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "InstanceRef": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + } + ], + "description": "Reference to a member Instance resource." + }, + "BigIpIntegration": { + "type": "object", + "required": [ + "integrationRef", + "serverPoolIp" + ], + "properties": { + "integrationRef": { + "description": "Reference to a BIG-IP Integration object, indicating that the Instances will be members of a BIG-IP server pool.", + "$ref": "#/components/schemas/ResourceRef" + }, + "serverPoolIp": { + "description": "The Instance IP addresses or CIDR to use when the Instance is a member of a BIG-IP server pool.\nIf this is a CIDR, then the Instance IP address that matches the mask will be the member address in the BIG-IP server pool.\nOtherwise, absolute IP addresses will be used as server-pool member addresses.\n", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "DevPortalsList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "DevPortal": { + "type": "object", + "description": "A Dev Portal.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/DevPortalDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/DevPortalCurrentStatus" + } + }, + "additionalProperties": false + }, + "DevPortalDesiredState": { + "type": "object", + "required": [ + "ingress" + ], + "properties": { + "ingress": { + "type": "object", + "required": [ + "gatewayRefs" + ], + "properties": { + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateways that act as a Developer Portal.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "additionalProperties": false + }, + "devPortalTheme": { + "$ref": "#/components/schemas/DevPortalTheme" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devPortalType": { + "type": "string", + "enum": [ + "private", + "public", + "partner" + ] + } + }, + "additionalProperties": false + }, + "DevPortalCurrentStatus": { + "type": "object", + "properties": { + "ingress": { + "type": "object", + "required": [ + "gatewayRefs" + ], + "properties": { + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateways that act as a Developer Portal.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "devPortalTheme": { + "$ref": "#/components/schemas/DevPortalTheme" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "publishedTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "Published time is a timestamp that represents the server time when the resource was published.\nResources that have never been published do not have an `published_time` stamp.\nThe default value is language-specific and, in general, should be equivalent of the null construct.\nIn JSON format, `published_time` type is encoded as a string as described in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n" + } + } + }, + "DevPortalTheme": { + "description": "Specifies the theming for the Developer Portal.", + "type": "object", + "properties": { + "overrideDefaultTheme": { + "type": "boolean", + "example": false, + "description": "Override the default Dev Portal theme with a custom theme." + }, + "customConfig": { + "type": "object", + "properties": { + "primary": { + "$ref": "#/components/schemas/ThemeConfig" + }, + "secondary": { + "$ref": "#/components/schemas/ThemeConfig" + }, + "fonts": { + "type": "object", + "properties": { + "assignments": { + "$ref": "#/components/schemas/FontAssignments" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "brandName": { + "$ref": "#/components/schemas/BrandName" + }, + "logo": { + "$ref": "#/components/schemas/FileEncodedString" + }, + "defaultLogo": { + "$ref": "#/components/schemas/FileEncodedString" + }, + "favicon": { + "$ref": "#/components/schemas/FileEncodedString" + } + }, + "additionalProperties": false + }, + "ThemeConfig": { + "type": "object", + "properties": { + "color": { + "$ref": "#/components/schemas/ThemeConfigColors" + } + }, + "additionalProperties": false + }, + "ThemeConfigColors": { + "type": "object", + "properties": { + "primary": { + "type": "string", + "example": "#575fe6", + "description": "A CSS color string used as a primary brand theme color." + }, + "accent": { + "type": "string", + "example": "#48dbac", + "description": "A CSS color string used as an optional second brand theme color." + }, + "gray": { + "type": "string", + "example": "#1e1f27", + "description": "A CSS color string used to generate a grayscale color palette." + }, + "link": { + "type": "string", + "example": "#0f55bd", + "description": "A CSS color string used to generate anchor link colors." + }, + "fill": { + "type": "string", + "example": "#fafbfc", + "description": "A CSS color string used as the main background color." + }, + "ink": { + "type": "string", + "example": "#323441", + "description": "A CSS color string used as the main text color." + }, + "status": { + "$ref": "#/components/schemas/ThemeConfigStatusColors" + } + }, + "additionalProperties": false + }, + "ThemeConfigStatusColors": { + "type": "object", + "description": "A collection of CSS color strings used to indicate status.", + "properties": { + "info": { + "type": "string", + "example": "#20a9ea", + "description": "A CSS color string used to indicate an informational status." + }, + "success": { + "type": "string", + "example": "#37c497", + "description": "A CSS color string used to indicate a success status." + }, + "error": { + "type": "string", + "example": "#ed4f54", + "description": "A CSS color string used to indicate an error status." + }, + "warning": { + "type": "string", + "example": "#ffb900", + "description": "A CSS color string used to indicate a warning status." + } + }, + "additionalProperties": false + }, + "ThemeConfigFonts": { + "type": "object", + "description": "A collection of fonts for theming typography.", + "properties": { + "headings": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for headlines." + }, + "body": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for body copy." + }, + "cta": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for calls to action." + }, + "code": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for code and syntax highlighting." + }, + "special": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for special accent typography." + }, + "baseFontSize": { + "$ref": "#/components/schemas/BaseFontSize" + }, + "embeddedLink": { + "$ref": "#/components/schemas/EmbeddedLink" + } + }, + "additionalProperties": false + }, + "ThemeConfigFont": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": [ + "google-web-font" + ] + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false + }, + "FileEncodedString": { + "type": "string", + "example": "c29tZXRoaW5nIA==", + "description": "Base64 encoded string of a logo." + }, + "BrandName": { + "type": "string", + "example": "Acme", + "description": "Name of the brand." + }, + "BaseFontSize": { + "type": "integer", + "example": 14 + }, + "EmbeddedLink": { + "type": "string" + }, + "FontAssignments": { + "type": "object", + "$ref": "#/components/schemas/ThemeConfigFonts" + }, + "EnvironmentName": { + "type": "string" + }, + "EnvironmentList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "Environment": { + "type": "object", + "description": "An Environment is a logical container that you can use to organize your Apps. A few commonly-used examples of Environments are \"dev\" and \"production\".", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "x-f5-experimental": true, + "type": "object" + }, + "currentStatus": { + "$ref": "#/components/schemas/EnvironmentCurrentStatus" + } + } + }, + "EnvironmentCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "gatewayRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "appRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "certRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "AppName": { + "type": "string" + }, + "APIDefinition": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/APIDefinitionCurrentStatus" + } + } + }, + "APIDefinitionCurrentStatus": { + "type": "object", + "properties": { + "apiDefinitionVersionRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "APIDefinitionList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "APIDefinitionSpecMapping": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/RESTAPISpec" + }, + { + "$ref": "#/components/schemas/gRPCProxySpec" + } + ] + } + }, + "RESTAPISpec": { + "type": "object", + "description": "Validates an Imported OpenAPI 3 spec formatted as JSON using the [OAS v3 schema.yaml](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.yaml) specification.\n" + }, + "gRPCProxySpec": { + "x-f5-experimental": true, + "type": "object", + "description": "Validates an Imported gRPC spec.\n" + }, + "APIDefinitionVersion": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/APIDefinitionVersionMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/APIDefinitionVersionDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/APIDefinitionVersionCurrentStatus" + } + } + }, + "APIDefinitionVersionList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "APIDefinitionVersionDesiredState": { + "type": "object", + "properties": { + "specs": { + "$ref": "#/components/schemas/APIDefinitionSpecMapping" + } + } + }, + "APIDefinitionVersionCurrentStatus": { + "type": "object", + "properties": { + "specs": { + "$ref": "#/components/schemas/APIDefinitionSpecMapping" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "apiDefinitionVersionRef": { + "type": "object", + "properties": { + "ref": { + "type": "string", + "description": "Reference to the Version of the API Definition.\n", + "example": "/services/api-definitions/baseball-stats/versions/v1" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "APIDefinitionVersionMeta": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceMeta" + }, + { + "type": "object", + "properties": { + "isDefaultVersion": { + "type": "boolean" + } + } + } + ] + }, + "Instance": { + "type": "object", + "description": "An NGINX Instance.", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceDesiredState" + } + } + }, + "GetInstanceResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Instance" + } + ] + }, + "ListInstanceResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Instance" + } + } + } + }, + "InstanceRequest": { + "allOf": [ + { + "$ref": "#/components/schemas/Instance" + } + ], + "description": "Describes the Instance to update." + }, + "InstanceDesiredState": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/AWSInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/AzureInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/VSphereInstanceDesiredState" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_INSTANCE": "#/components/schemas/OtherInstanceDesiredState", + "AWS_INSTANCE": "#/components/schemas/AWSInstanceDesiredState", + "AZURE_INSTANCE": "#/components/schemas/AzureInstanceDesiredState", + "VSPHERE_INSTANCE": "#/components/schemas/VSphereInstanceDesiredState" + } + } + }, + "InstanceCurrentStatus": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/AWSInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/AzureInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/VSphereInstanceCurrentStatus" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_INSTANCE": "#/components/schemas/OtherInstanceCurrentStatus", + "AWS_INSTANCE": "#/components/schemas/AWSInstanceCurrentStatus", + "AZURE_INSTANCE": "#/components/schemas/AzureInstanceCurrentStatus", + "VSPHERE_INSTANCE": "#/components/schemas/VSphereInstanceCurrentStatus" + } + } + }, + "OtherInstanceDesiredState": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "OTHER_INSTANCE is an Instance pre-installed and self-registered during NGINX installation.\n", + "enum": [ + "OTHER_INSTANCE" + ] + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "AWSInstanceDesiredState": { + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "AWS_INSTANCE is an Instance hosted in Amazon Web Services (AWS).\n", + "enum": [ + "AWS_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "AzureInstanceDesiredState": { + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "AZURE_INSTANCE is an Instance hosted in Microsoft Azure.", + "enum": [ + "AZURE_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "VSphereInstanceDesiredState": { + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "An Instance that resides on a VSphere host.\n", + "enum": [ + "VSPHERE_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "OtherInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the Other Instance.", + "required": [ + "type", + "hostname", + "version", + "agent", + "status", + "muted" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "OTHER_INSTANCE is an Instance pre-installed and self-registered during NGINX installation.\n", + "enum": [ + "OTHER_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/OtherNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "status": { + "deprecated": true, + "allOf": [ + { + "$ref": "#/components/schemas/ConfigState" + } + ] + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "AWSInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the AWS Instance.", + "required": [ + "type", + "hostname", + "version", + "agent", + "muted" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "AWS_INSTANCE is an Instance hosted in Amazon Web Services (AWS).\n", + "enum": [ + "AWS_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/AWSNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "AzureInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the Azure Instance.", + "required": [ + "type", + "hostname", + "version", + "agent" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the mute status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "AZURE_INSTANCE is an Instance hosted in Microsoft Azure.", + "enum": [ + "AZURE_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/AzureNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "VSphereInstanceCurrentStatus": { + "type": "object", + "description": "Reflects the current status of the VSphere Instance.", + "required": [ + "type", + "version", + "hostname", + "agent" + ], + "properties": { + "type": { + "type": "string", + "description": "An Instance that resides on a VSphere host.\nVSPHERE_INSTANCE is an Instance hosted in VSphere.\n", + "enum": [ + "VSPHERE_INSTANCE" + ] + }, + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "TemplateRef": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + } + ], + "description": "Reference to an existing Instance Template resource. This field cannot be updated." + }, + "LegacySystemMetadata": { + "type": "object", + "deprecated": true, + "description": "Metadata that describe the operating system attributes and properties of an Instance host system. It is\nintended for internal use only and is subject to change.\n", + "additionalProperties": true + }, + "LegacyNginxMetadata": { + "type": "object", + "deprecated": true, + "description": "Metadata that describe an Instance's NGINX process configuration and properties. It is intended\nfor internal use only and is subject to change.\n", + "additionalProperties": true + }, + "Agent": { + "type": "object", + "description": "The properties of the Controller Agent running on the Instance", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string", + "description": "The version of Controller Agent that is currently running on the Instance." + }, + "online": { + "type": "boolean", + "description": "The status of Controller Agent that is currently running on the Instance." + }, + "credentials": { + "$ref": "#/components/schemas/AgentCredentials" + } + } + }, + "AgentCredentials": { + "type": "object", + "description": "The credentials of the Controller Agent running on the Instance.", + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Agent." + }, + "uuid": { + "type": "string", + "description": "The uuid of the Agent." + } + } + }, + "OtherNetworkConfig": { + "type": "object", + "description": "The network config of a customer deployed Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OtherNetworkInterface" + } + } + } + }, + "OtherNetworkInterface": { + "type": "object", + "description": "A network interface for a customer deployed Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "privateDnsName": { + "type": "string", + "description": "The private, internal hostname of the instance, which resolves to the Instance's private IP address.\n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "privateIPv6": { + "type": "string", + "description": "The private IPv6 address of the network interface." + }, + "alternateIPList": { + "type": "array", + "items": { + "type": "string" + } + }, + "alternateIPv6List": { + "type": "array", + "items": { + "type": "string" + } + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "AWSNetworkConfig": { + "type": "object", + "description": "The network config of an AWS Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSNetworkInterface" + } + } + } + }, + "AWSNetworkInterface": { + "type": "object", + "description": "A network interface for an AWS Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "privateDnsName": { + "type": "string", + "description": "The private, internal hostname of the instance, which resolves to the Instance's private IP address. \n" + }, + "publicDnsName": { + "type": "string", + "description": "The public hostname of the instance, which resolves to the public IP address of the Instance. \n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "publicIP": { + "type": "string", + "description": "The public IP address of the network interface." + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "subnetID": { + "type": "string", + "description": "The ID of the subnet into which the instance was launched." + }, + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "AzureNetworkConfig": { + "type": "object", + "description": "The network config of an Azure Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureNetworkInterface" + } + } + } + }, + "AzureNetworkInterface": { + "type": "object", + "description": "A network interface associated with an Azure Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "publicDnsName": { + "type": "string", + "description": "The public hostname of the instance, which resolves to the public IP address of the Instance. \n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "publicIP": { + "type": "string", + "description": "The public IP address of the network interface." + }, + "privateIPv6": { + "type": "string", + "description": "The private IPv6 address of the network interface." + }, + "publicIPv6": { + "type": "string", + "description": "The public IPv6 address of the network interface." + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "subnetID": { + "type": "string", + "description": "The ID of the subnet that contains the Instance." + }, + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "Nginx": { + "type": "object", + "description": "Defines properties and configuration values for Nginx.\n", + "properties": { + "process": { + "$ref": "#/components/schemas/NginxProcess" + }, + "performance": { + "$ref": "#/components/schemas/Performance" + } + } + }, + "NginxProcess": { + "type": "object", + "description": "Defines configuration directives that are defined in the main configuration context.\n", + "properties": { + "user": { + "type": "string", + "description": "Defines user credentials used by worker processes.\n", + "default": "nginx" + }, + "group": { + "type": "string", + "description": "Defines group credentials used by worker processes. This will be ignored if the user\nproperty is not defined.\n", + "default": "nginx" + } + } + }, + "Performance": { + "type": "object", + "description": "Defines performance tuning directives that are defined in the main configuration context.\n", + "properties": { + "workerProcesses": { + "type": "integer", + "description": "Defines the number of worker processes. To set it to the number of available CPU cores\nfor a system, use 0.\n", + "minimum": 0, + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#worker_processes" + } + }, + "workerPriority": { + "type": "integer", + "description": "Defines the scheduling priority for worker processes like it is done by the nice command:\na negative number means higher priority. Allowed range normally varies from -20 to 20.\n", + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#worker_priority" + } + }, + "workerConnections": { + "type": "integer", + "description": "Sets the maximum number of simultaneous connections that can be opened by a worker process.\nThis number includes all the connections like proxied servers, connection with clients.\n", + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#worker_connections" + } + }, + "workerRlimitNofile": { + "type": "integer", + "description": "Sets the limit on the maximum number of open files for worker processes.\nUsed to increase the limit without restarting the main process.\n", + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile" + } + }, + "multiAccept": { + "type": "boolean", + "description": "Sets if the worker process will allow more than one connection at a time. If multiAccept is disabled,\nworker process only accepts one connection at a time.\n", + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#multi_accept" + } + } + } + }, + "SelfLinks": { + "type": "object", + "description": "The SelfLinks object contains a link from the resource to itself.\nThis object is used only in responses.\n", + "properties": { + "rel": { + "type": "string", + "example": "/api/v1/services/environments/prod", + "description": "`rel` contains the complete path fragment of a URI and can be used\nto construct a query to the object.\n" + } + } + }, + "ResourceMeta": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\*\\\"\\[\\]\\{\\}\\\\\\/%\\?:=&\\~\\^|#<>]+$", + "not": { + "type": "string", + "enum": [ + ".", + ".." + ] + }, + "minLength": 1, + "maxLength": 1024, + "example": "resource-name", + "description": "Resource name is a unique identifier for a resource within the context of a namespace.\nResource names must conform to [RFC 1738 Section 2.2](https://www.ietf.org/rfc/rfc1738.txt) and have a valid syntax for email addresses. The following rules are enforced:\n\n- do not utilize URL encoding;\n- do not include spaces;\n- do not use uppercase characters, for example, 'A-Z'; extended character sets are supported;\n- do not use the following characters: `\"`, `*`, `:`, `;`, `/`, `\\`, `%`, `?`, `hash`, `=`, `&`, `|`, `~`, `^`, `{`, `}`, `[`, `]`, `<`, `>`;\n- cannot start or end with an `@` sign;\n- cannot be only `.` or `..`\n\nFor example: For a collection resource located at\n\n`https://controller.example.com/api/v1/services/apps/shopping_@1`\n\nthe resource name is \"shopping_@1\".\n" + }, + "displayName": { + "type": "string", + "example": "My Display Name", + "description": "`displayName` is a user friendly resource name. It can be used to define \na longer, and less constrained, name for a resource.\n\nDisplay names:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "description": { + "type": "string", + "example": "This is a sample description string. It provides information about the resource.", + "description": "`description` is a free-form text property. You can use it to provide information that helps \nto identify the resource.\n\nDescriptions:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "kind": { + "type": "string", + "example": "-", + "description": "Kind is a string representation of an API resource's data type.\nIt is assigned by the server and cannot be changed. \n\nWhen creating a `kind`, the server uses hyphens to connect word segments; \nsingleton and collection item resources are not pluralized.\n" + }, + "uid": { + "type": "string", + "format": "uuid", + "example": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "description": "Unique Identifier (UID)\n\nUID is a unique identifier in time and space for a resource. \nWhen you create a resource, the server assigns a UID to the resource.\n\nRefer to [IETF RFC 4122](https://tools.ietf.org/html/rfc4122) for more information.\n" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ], + "description": "You can assign `tags` to a resource as a way to help map, scope, \nand organize resources. \n\nThe system uses tag selectors to specify selection criteria that \nmatch resources that have particular tags.\n" + }, + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "The `ref` field contains a reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/SelfLinks" + }, + "createTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was created.\n\nCreate time is not guaranteed to be set in \"happens-before\" order\nacross separate operations.\n\nIn JSON format, `create_time` type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n\nCreate Time is assigned by the server and cannot be changed.\n" + }, + "updateTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was last modified.\n\nResources that have never been updated do not have an `update_time` stamp.\n\nThe default value for resources that have never been updated is the local \nlanguage-specific equivalent of \"null\".\n\nIn JSON format, `update_time` type is encoded as a string as described in \n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n" + } + } + }, + "ConfigStateTally": { + "type": "object", + "properties": { + "isConfigured": { + "type": "boolean", + "description": "The configuration operation is complete." + }, + "isConfiguring": { + "type": "boolean", + "description": "The configuration of the resource, or of its child(ren), is in process." + }, + "isError": { + "type": "boolean", + "description": "An error occurred while configuring the resource or its child(ren)." + }, + "isDeleting": { + "type": "boolean", + "description": "A delete operation is in progress for the resource or its child(ren)." + }, + "total": { + "type": "integer", + "description": "The total number of resources to which the configuration operation applies." + }, + "configured": { + "type": "integer", + "description": "The number of resources that have a complete and valid configuration." + }, + "configuring": { + "type": "integer", + "description": "The number of resources that are in the process of being configured." + }, + "error": { + "type": "integer", + "description": "The number of resources that have encountered an error during the configuration process." + }, + "deleting": { + "type": "integer", + "description": "The number of resources that are in the process of being deleted." + } + } + }, + "ConfigCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The condition type." + }, + "message": { + "type": "string", + "description": "A human-readable message that provides additional information about the configuration operation." + } + } + }, + "ConfigState": { + "type": "object", + "description": "A representation of the resource's current configuration state \nthat comprises the status of the resource itself (`selfConfigState`) and any child \nresources (`childrenConfigState`).\n\nThe conditions array provides additional information during configuration changes.\n", + "properties": { + "selfConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "childrenConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigCondition" + } + } + } + }, + "NamedLinks": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfLinks" + }, + { + "type": "object", + "description": "Contains information about the object being referred to.\n\nThese are generally details -- like the object name and display name --\nthat are useful to a consumer of the API that performs further\nprocessing. \n\nThis object is only present in responses.\n \n", + "properties": { + "name": { + "type": "string", + "example": "production", + "description": "The name of the linked resource.\n" + }, + "displayName": { + "type": "string", + "example": "Production Environment", + "description": "A user friendly resource name." + } + } + } + ] + }, + "ResourceRef": { + "type": "object", + "required": [ + "ref" + ], + "properties": { + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "A reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "ErrorDetail": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "example": "Error doing : . This can lead to . Try to resolve the issue.", + "description": "A detailed error message returned by the server. \n\nThese messages contain the following information, where applicable:\n\n- What happened.\n- Why it happened.\n- What the consequences are (if any).\n- Recommended action to take to resolve the issue.\n" + } + } + }, + "ErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string", + "example": "Error doing .", + "description": "A human-readable message, in English, that describes the error.\n" + }, + "code": { + "type": "integer", + "example": 1234567, + "description": "A numeric error code that can be used to identify errors for support purposes.\n" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorDetail" + } + } + } + }, + "ErrorSetList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorSet" + } + } + } + }, + "ErrorSet": { + "type": "object", + "description": "Defines the set of error messages to be returned for HTTP errors.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/ErrorSetDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/ErrorSetCurrentStatus" + } + } + }, + "ErrorSetDesiredState": { + "type": "object", + "properties": { + "errorCodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorCode" + } + } + } + }, + "ErrorSetCurrentStatus": { + "type": "object", + "properties": { + "errorCodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorCode" + } + } + } + }, + "ErrorCode": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "minimum": 400, + "maximum": 599, + "example": 404 + }, + "message": { + "type": "string", + "example": "{\"status\":404,\"message\":\"Resource not found\"}" + } + } + }, + "PublishedAPIList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "PublishedAPI": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/PublishedAPICurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/PublishedAPIDesiredState" + } + } + }, + "PublishedAPICurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "basePath": { + "type": "string", + "default": "/" + }, + "stripWorkloadBasePath": { + "type": "boolean", + "default": true + }, + "componentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "apiDefinitionVersionRef": { + "description": "Reference to the Version of the API Definition.\n", + "$ref": "#/components/schemas/ResourceRef" + }, + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateway associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devportalRefs": { + "type": "array", + "description": "Reference to the Dev Portal associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "PublishedAPIDesiredState": { + "type": "object", + "required": [ + "apiDefinitionVersionRef", + "gatewayRefs" + ], + "properties": { + "basePath": { + "type": "string", + "default": "/" + }, + "stripWorkloadBasePath": { + "type": "boolean", + "default": true + }, + "apiDefinitionVersionRef": { + "description": "Reference to the Version of the API Definition.\n", + "$ref": "#/components/schemas/ResourceRef" + }, + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateway associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devportalRefs": { + "type": "array", + "description": "Reference to the Dev Portal associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "InstanceTemplate": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceTemplateState" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceTemplateState" + } + } + }, + "GetInstanceTemplateResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/InstanceTemplate" + } + ] + }, + "ListInstanceTemplateResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceTemplate" + } + } + } + }, + "InstanceTemplateState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSInstanceTemplate" + }, + { + "$ref": "#/components/schemas/AzureInstanceTemplate" + }, + { + "$ref": "#/components/schemas/VSphereInstanceTemplate" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_INSTANCE_TEMPLATE": "#/components/schemas/AWSInstanceTemplate", + "AZURE_INSTANCE_TEMPLATE": "#/components/schemas/AzureInstanceTemplate", + "VSPHERE_INSTANCE_TEMPLATE": "#/components/schemas/VSphereInstanceTemplate" + } + } + }, + "AWSInstanceTemplate": { + "type": "object", + "required": [ + "type", + "amiID", + "instanceType", + "subnetID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "AWS_INSTANCE_TEMPLATE" + ] + }, + "amiID": { + "type": "string", + "description": "The AWS `amiID` for the image to use when deploying an Instance using the template.\n" + }, + "instanceType": { + "type": "string", + "description": "The machine size.\n" + }, + "subnetID": { + "type": "string", + "description": "The `subnetID` of the AWS subnet where new Instances created using the Instance Template should reside.\n\nThe specified subnet must be in the same AWS Virtual Private Cloud (VPC) as the Instance Template's parent Location resource.\n" + }, + "securityGroupIDs": { + "type": "array", + "description": "The list of AWS securityGroupIDs that you want to apply to new Instances. \n\nThe Security GroupIDs must be available in the same AWS region and Virtual Private Cloud (VPC) as the Instance Template's parent Location resource.\n", + "items": { + "type": "string" + } + }, + "publicKey": { + "type": "string", + "description": "Provide the public key that you want to use to authenticate to the EC2 instance that this template will create. \n" + }, + "associatePublicIPAddress": { + "type": "boolean", + "description": "Specify if a public IP address should be assigned to the instance.\n" + } + } + }, + "AzureInstanceTemplate": { + "type": "object", + "required": [ + "type", + "instanceType", + "image", + "networkInterface", + "adminUser", + "publicKey" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "AZURE_INSTANCE_TEMPLATE" + ] + }, + "image": { + "$ref": "#/components/schemas/AzureImage" + }, + "instanceType": { + "type": "string", + "description": "The virtual machine size and type." + }, + "networkInterface": { + "$ref": "#/components/schemas/AzureNetworkInterface" + }, + "adminUser": { + "type": "string", + "description": "The name of the administration account." + }, + "publicKey": { + "type": "string", + "description": "The Public Key string for the adminUser." + } + } + }, + "AzureImage": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureImageID" + }, + { + "$ref": "#/components/schemas/AzureImageReference" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AZURE_IMAGE_ID": "#/components/schemas/AzureImageID", + "AZURE_IMAGE_REFERENCE": "#/components/schemas/AzureImageReference" + } + } + }, + "AzureImageID": { + "type": "object", + "description": "The Azure resource ID for the image to use when deploying an Instance.", + "required": [ + "type", + "imageID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Image.", + "enum": [ + "AZURE_IMAGE_ID" + ] + }, + "imageID": { + "type": "string", + "description": "The resource ID of the Azure image." + } + } + }, + "AzureImageReference": { + "type": "object", + "description": "The parameters that identify which Azure Marketplace image to use for the Instance.", + "required": [ + "type", + "publisher", + "offer", + "sku" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Image.", + "enum": [ + "AZURE_IMAGE_REFERENCE" + ] + }, + "publisher": { + "type": "string", + "description": "The publisher of the Azure Marketplace image." + }, + "offer": { + "type": "string", + "description": "The offer of the Azure Marketplace image." + }, + "sku": { + "type": "string", + "description": "The SKU of the Azure Marketplace image." + }, + "version": { + "type": "string", + "description": "The version of the Azure Marketplace image (default is latest)." + } + } + }, + "AzureNetworkID": { + "type": "object", + "description": "Identifies the existing Azure Network Interface that you want the Instance to use.", + "required": [ + "type", + "nicID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Network Interface.", + "enum": [ + "AZURE_NIC_ID" + ] + }, + "nicID": { + "type": "string", + "description": "The ID of the Azure Network Interface." + } + } + }, + "VSphereInstanceTemplate": { + "type": "object", + "required": [ + "type", + "image", + "computeResource", + "numCPUs", + "memoryMB" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "VSPHERE_INSTANCE_TEMPLATE" + ] + }, + "image": { + "type": "string", + "description": "The VSphere virtual machine template that you want to deploy an Instance from.\nBe sure to specify the full path to the desired template.\n" + }, + "computeResource": { + "type": "string", + "description": "The name of the VSphere Host, Cluster, or Resource Pool that you want to add the Instance to.\nBe sure to provide the full path to the desired resource.\n" + }, + "datastore": { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "string" + }, + "description": "A list of VSphere datastores that you want to attach to the Instance.\nBe sure to specify the full path to the desired resource(s).\n> Note: When defined, this setting will override the datastore configured in the virtual machine template.\n" + }, + "network": { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "string" + }, + "description": "A list of the VSphere networks that you want to attach to the Instance. You can connect the Instance to VM Networks, Distributed Virtual Switches, and/or Port Groups.\n> Note: When defined, this setting will override the network configured in the virtual machine template.\n" + }, + "numCPUs": { + "type": "integer", + "description": "The number of vCPUs to configure on the Instance.\n" + }, + "memoryMB": { + "type": "integer", + "description": "The amount of memory (in MB) to configure on the Instance.\n" + } + } + }, + "StrategyDesiredState": { + "type": "object", + "description": "The defired state of the strategy", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/StrategyData" + } + } + }, + "StrategyList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "StrategyStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/StrategyDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/StrategyCurrentStatus" + } + } + }, + "StrategyCurrentStatus": { + "type": "object", + "description": "Shows the current status of the strategy.", + "required": [ + "state", + "content" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/StrategyData" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "Strategy": { + "type": "object", + "description": "Contains the strategy to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/StrategyDesiredState" + } + } + }, + "StrategyData": { + "type": "object", + "description": "Strategy Data.", + "required": [ + "securityPolicyRef" + ], + "properties": { + "securityPolicyRef": { + "type": "string", + "description": "Reference to the Nginx Application Protection policy used in this strategy.", + "example": "/security/policies/mynappolicy" + } + } + }, + "Integration": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/IntegrationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/IntegrationState" + } + }, + "example": { + "metadata": { + "name": "my-aws-integration", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY_CREDENTIAL", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY_CREDENTIAL", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "GetIntegrationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Integration" + } + ] + }, + "ListIntegrationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "IntegrationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSIntegration" + } + ], + "discriminator": { + "propertyName": "type" + } + }, + "AWSIntegration": { + "required": [ + "type", + "credential" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AWS_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string" + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSAccessKeyCredential" + } + ], + "discriminator": { + "propertyName": "type" + } + } + } + }, + "AWSAccessKeyCredential": { + "required": [ + "type", + "accessKeyID", + "secretAccessKey" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AWS_ACCESS_KEY_CREDENTIAL" + ] + }, + "accessKeyID": { + "type": "string" + }, + "secretAccessKey": { + "type": "string" + } + } + }, + "PolicyDesiredState": { + "type": "object", + "description": "The defired state of the policy", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/PolicyData" + } + } + }, + "PolicyList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "PolicyStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/PolicyDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/PolicyCurrentStatus" + } + } + }, + "PolicyCurrentStatus": { + "type": "object", + "description": "Shows the current status of the policy.", + "required": [ + "state", + "data" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/PolicyData" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "Policy": { + "type": "object", + "description": "Contains the policy to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/PolicyDesiredState" + } + } + }, + "PolicyData": { + "type": "object", + "description": "Contains the policy to upload.", + "example": { + "policy": { + "name": "mynappolicy", + "template": { + "name": "POLICY_TEMPLATE_NGINX_BASE" + }, + "applicationLanguage": "utf-8", + "enforcementMode": "blocking", + "signatures": [ + { + "signatureId": 123458888, + "enabled": false + }, + { + "signatureId": 200000098, + "enabled": false + }, + { + "signatureId": 200001475, + "enabled": false + }, + { + "signatureId": 200002595, + "enabled": false + } + ], + "bot-defense": { + "settings": { + "isEnabled": false + } + }, + "headers": [ + { + "name": "*", + "type": "wildcard", + "decodeValueAsBase64": "disabled" + }, + { + "name": "*-bin", + "type": "wildcard", + "decodeValueAsBase64": "required" + }, + { + "name": "Referer", + "type": "explicit", + "decodeValueAsBase64": "disabled" + }, + { + "name": "Authorization", + "type": "explicit", + "decodeValueAsBase64": "disabled" + }, + { + "name": "Transfer-Encoding", + "type": "explicit", + "decodeValueAsBase64": "disabled" + } + ], + "cookies": [ + { + "name": "*", + "type": "wildcard", + "decodeValueAsBase64": "disabled" + } + ], + "parameters": [ + { + "name": "*", + "type": "wildcard", + "decodeValueAsBase64": "disabled" + } + ] + } + } + } + }, + "examples": { + "IdentityProviderRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "environmentRefs": [ + { + "ref": "/services/environments/dev" + } + ], + "identityProvider": { + "type": "API_KEY" + } + } + } + }, + "IdentityProviderClientListRequest": { + "value": { + "items": [ + { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + ] + } + }, + "IdentityProviderClientRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + }, + "IdentityProviderClientPatchMetadataRequest": { + "value": { + "metadata": { + "name": "resource-name", + "description": "This is a sample description string. It provides information about the resource." + } + } + }, + "IdentityProviderClientPatchDesiredStateRequest": { + "value": { + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + }, + "AWSInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "tags": [ + "prod-1", + "dev-1" + ] + }, + "desiredState": { + "type": "AWS_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/aws-east/instance-templates/small-dev-template" + } + } + } + }, + "AzureInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "tags": [ + "prod-1", + "dev-1" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/small-dev-template" + } + } + } + }, + "VSphereInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1" + }, + "desiredState": { + "type": "VSPHERE_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/dc-sea/instance-templates/small-dev-template" + } + } + } + }, + "InstanceUpdateRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "description": "An example NGINX Instance.", + "tags": [ + "prod-1", + "dev-1" + ] + } + } + }, + "AWSInstance": { + "value": { + "metadata": { + "name": "instance-1", + "displayName": "My Instance", + "tags": [ + "prod-1", + "dev-1" + ], + "links": { + "rel": "/infrastructure/locations/unspecified/instances/instance-1" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T09:12:33.001Z" + }, + "desiredState": { + "type": "AWS_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/aws-uswest-2/instance-templates/my-t2-medium" + } + }, + "currentStatus": { + "type": "AWS_INSTANCE", + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "hostname": "instance-1.mycloud.net", + "version": "1.17.3", + "muted": false, + "networkConfig": { + "networkInterfaces": [ + { + "name": "eth0", + "privateDnsName": "ip-172-16-0-71.us-west-2.compute.internal", + "publicDnsName": "ec2-54-212-110-173.us-west-2.compute.amazonaws.com", + "privateIP": "172.16.0.71", + "publicIP": "54.212.110.173", + "subnet": { + "subnetID": "subnet-055d28be58feb0a7d", + "cidrIPv4": "172.16.0.0/24" + } + } + ] + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": 2.8 + }, + "legacyNginxMetadata": { + "build": "nginx-plus-r19", + "built_from_source": false, + "last_seen": "2019-11-12T23:47:52.966607Z", + "pid": 2749, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "19-1~bionic" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": null, + "user": "nginx", + "with-cc-opt": "-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.17.3/debian/debuild-base/nginx-plus-1.17.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ] + }, + "start_time": 1573580604000 + }, + "legacySystemMetadata": { + "boot": 1573580280000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "network": { + "default": "lo", + "interfaces": { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + } + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": 1, + "cpus": 4, + "hypervisor": "VMware", + "mhz": 2300, + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": 18.04 + } + } + } + } + }, + "AzureInstance": { + "value": { + "metadata": { + "name": "instance-1", + "createTime": "2020-10-27T22:14:36.994172Z", + "description": "My Azure Instance", + "displayName": "Instance-1", + "tags": [ + "prod-1", + "dev-1" + ], + "kind": "instance", + "links": { + "rel": "/api/v1/infrastructure/locations/azure-westus2/instances/instance-1" + }, + "ref": "/infrastructure/locations/azure-westus2/instances/instance-1", + "uid": "4ed722ec-1bc0-47a1-9772-87718fa9ddb8", + "updateTime": "2020-10-27T22:14:36.994172Z" + }, + "desiredState": { + "nginx": { + "process": { + "group": "test", + "user": "testuser" + } + }, + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/azure-standard-ds1v2" + }, + "type": "AZURE_INSTANCE" + }, + "currentStatus": { + "networkConfig": { + "networkInterfaces": [ + { + "name": "my-nic-1", + "publicDnsName": "myapp.westus2.cloudapp.azure.com", + "privateIP": "10.0.1.4", + "publicIP": "52.229.16.198", + "subnet": { + "subnetID": "subnet-test", + "cidrIPv4": "10.0.1.0/24" + } + } + ] + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": "3.12.5" + }, + "hostname": "instance-1", + "instanceID": "ce266e67-42ec-41a0-b8f4-f4cd0be01828", + "legacyNginxMetadata": { + "build": "nginx-plus-r22", + "built_from_source": true, + "id": 6, + "last_seen": "2020-10-27T22:30:34.376659Z", + "pid": 1138, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "nginx-plus-r22" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": "", + "user": "nginx", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + " 11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + " 11 Sep 2018" + ] + }, + "start_time": 1603836993, + "version": "1.19.0" + }, + "legacySystemMetadata": { + "boot": 1603836911000, + "disk_partitions": [ + { + "device": "/dev/sda1", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda15", + "fstype": "vfat", + "mountpoint": "/boot/efi" + }, + { + "device": "/dev/sdb1", + "fstype": "ext4", + "mountpoint": "/mnt" + } + ], + "id": 5, + "network": { + "default": "eth0", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "10.0.1.4", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "ipv6": { + "address": "fe80::20d:3aff:fec5:3f80", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:0d:3a:c5:3f:80", + "name": "eth0" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "36608K" + }, + "cores": "1", + "cpus": "1", + "hypervisor": "Microsoft", + "mhz": "2095.191", + "model": "Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.5 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "nginx": { + "process": { + "group": "test", + "user": "testuser" + } + }, + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/azure-standard-ds1v2" + }, + "type": "AZURE_INSTANCE", + "version": "1.19.0" + } + } + }, + "OtherInstance": { + "value": { + "metadata": { + "name": "test_instance_1", + "displayName": "Test Instance 1", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified/instances/test_instance_1" + }, + "createTime": "2020-05-20T20:02:18.107875Z", + "updateTime": "2020-05-20T20:02:18.107875Z" + }, + "desiredState": { + "type": "OTHER_INSTANCE" + }, + "currentStatus": { + "type": "OTHER_INSTANCE", + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "status": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": "999.0.0-1" + }, + "hostname": "test-fab4edf8-data-1.test", + "legacyNginxMetadata": { + "build": "nginx-plus-r21", + "built_from_source": false, + "id": 2, + "last_seen": "2020-05-20T20:40:21.146894Z", + "pid": 2995, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "21-1~bionic" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": null, + "user": "nginx", + "with-cc-opt": "'-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.17.9/debian/debuild-base/nginx-plus-1.17.9=. -fstack-protector-strong -Wformat -Werror=format-security,-D_FORTIFY_SOURCE=2 -fPIC'", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ] + }, + "start_time": 1590004864000 + }, + "legacySystemMetadata": { + "boot": 1590004492000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "id": 1, + "network": { + "default": "lo", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "192.0.10.1", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "mac": "02:42:98:fb:40:48", + "name": "docker0" + }, + { + "ipv4": { + "address": "10.149.41.181", + "netmask": "255.255.240.0", + "prefixlen": 20 + }, + "ipv6": { + "address": "fe80::250:56ff:fe98:e2f1", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:50:56:98:e2:f1", + "name": "ens32" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": "1", + "cpus": "4", + "hypervisor": "VMware", + "mhz": "2300.000", + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "version": "1.17.9" + } + } + }, + "ListInstanceResponse": { + "value": { + "items": [ + { + "currentStatus": { + "agent": { + "version": "3.7.44" + }, + "hostname": "i-563457274582", + "legacyNginxMetadata": { + "build": "nginx-plus-r22", + "built_from_source": false, + "id": 2, + "last_seen": "2020-07-08T17:24:07.869745Z", + "pid": 3104, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": {}, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": "", + "user": "nginx", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "", + "11", + "Sep", + "2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "", + "11", + "Sep", + "2018" + ] + }, + "start_time": 0 + }, + "legacySystemMetadata": { + "boot": 1594225800000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "id": 1, + "network": { + "default": "", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "10.149.41.97", + "netmask": "255.255.240.0", + "prefixlen": 20 + }, + "ipv6": { + "address": "fe80::250:56ff:fe98:b512", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:50:56:98:b5:12", + "name": "ens32" + }, + { + "ipv4": { + "address": "192.0.10.1", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "mac": "02:42:24:f1:ae:8a", + "name": "docker0" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": "1", + "cpus": "4", + "hypervisor": "VMware", + "mhz": "2300.000", + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "status": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "type": "OTHER_INSTANCE", + "version": "1.19.0" + }, + "desiredState": { + "type": "OTHER_INSTANCE" + }, + "metadata": { + "createTime": "2020-07-08T16:42:07.97301Z", + "displayName": "Test Instance 1", + "kind": "instance", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified/instances/instance-1" + }, + "name": "instance-1", + "ref": "/infrastructure/locations/unspecified/instances/instance-1", + "uid": "ec8d8dac-10b6-4195-943b-1a5d65dd131c", + "updateTime": "2020-07-08T16:42:07.97301Z" + } + } + ] + } + }, + "InstanceGroupRequest": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + }, + "GetInstanceGroupResponse": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + }, + "ListInstanceGroupsResponse": { + "value": { + "items": [ + { + "currentStatus": { + "instanceRefs": [], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "us-west-2 autoscale group", + "displayName": "aws-autoscale-group", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/amz-us-west-2-as-group" + }, + "name": "amz-us-west-2-as-group", + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + }, + "ComponentRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "ingress": { + "uris": { + "/api/golf/": { + "matchMethod": "PREFIX" + } + }, + "gatewayRefs": [ + { + "ref": "/services/environments/dev/gateways/sportsgw" + } + ] + }, + "publishedApiRefs": [ + { + "ref": "/services/environments/dev/apps/sports/published-apis/golf-pub" + } + ], + "backend": { + "workloadGroups": { + "serverGrp1": { + "uris": { + "{{httpWorkloadInstance1}}": {} + } + } + }, + "monitoring": {} + }, + "security": { + "rateLimit": { + "defaultLimit": { + "rate": 1, + "rateMeasure": "SECONDS" + } + } + }, + "caching": { + "splitConfig": { + "key": "${remote_addr}${http_user_agent}${date_gmt}", + "criteriaType": "PERCENTAGE" + }, + "diskStores": [ + { + "path": "/tmp/hdd1", + "maxSize": "5G", + "minFree": "10M", + "inMemoryStoreSize": "100M", + "tempPath": "ENABLED", + "inactiveTime": "2m", + "percentCriteria": "100%", + "directoryLevel": { + "first": 1, + "mid": 2, + "last": 1 + }, + "trimPolicy": { + "maxFiles": 150, + "frequency": "100m", + "durationThreshold": "30m" + }, + "loaderPolicy": { + "maxFiles": 150, + "frequency": "100m", + "durationThreshold": "30m" + }, + "purgerPolicy": { + "maxFiles": 150, + "frequency": "100m", + "durationThreshold": "30m" + } + } + ] + } + } + } + }, + "OtherLocationRequest": { + "value": { + "metadata": { + "name": "my-other-location", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "OTHER_LOCATION" + } + } + }, + "AWSLocationRequest": { + "value": { + "metadata": { + "name": "my-aws-location", + "description": "AWS Location for us-east-1", + "displayName": "us-east-1-location", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AWS_LOCATION", + "vpcID": "vpc-1234", + "region": "us-east-1", + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + } + } + } + }, + "AzureLocationRequest": { + "value": { + "metadata": { + "name": "my-azure-location", + "description": "Azure Location for West US 2", + "displayName": "westus2-location", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_LOCATION", + "resourceGroup": "myResourceGroup", + "subscriptionID": "mySubscriptionID", + "region": "westus2", + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + } + } + } + }, + "OtherLocationResponse": { + "value": { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + }, + "AWSLocationResponse": { + "value": { + "currentStatus": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + }, + "region": "us-east-1", + "type": "AWS_LOCATION", + "vpcID": "vpc-1234" + }, + "desiredState": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + }, + "region": "us-east-1", + "type": "AWS_LOCATION", + "vpcID": "vpc-1234" + }, + "metadata": { + "createTime": "2020-05-13T16:57:02.931198Z", + "description": "AWS Location for us-east-1", + "displayName": "us-east-1-location", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-aws-location" + }, + "name": "my-aws-location", + "tags": [ + "dev", + "prod" + ], + "uid": "62f72025-59a1-4c11-8cca-798b5e12efb8", + "updateTime": "2020-05-13T16:57:02.931198Z" + } + } + }, + "AzureLocationResponse": { + "value": { + "currentStatus": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + }, + "type": "AZURE_LOCATION", + "subscriptionID": "mySubscriptionID", + "region": "westus2" + }, + "desiredState": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + }, + "type": "AZURE_LOCATION", + "subscriptionID": "mySubscriptionID", + "region": "westus2" + }, + "metadata": { + "createTime": "2020-05-13T16:57:02.931198Z", + "description": "Azure Location for West US 2", + "displayName": "westus2-location", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-azure-location" + }, + "name": "my-azure-location", + "tags": [ + "dev", + "prod" + ], + "uid": "62f72025-59a1-4c11-8cca-798b5e12efb8", + "updateTime": "2020-05-13T16:57:02.931198Z" + } + } + }, + "ListLocationResponse": { + "value": { + "items": [ + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "Location for instances where location has not been specified", + "displayName": "Unspecified (default)", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified" + }, + "name": "unspecified", + "tags": [ + "default" + ], + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + }, + "AWSRequest": { + "value": { + "metadata": { + "name": "my-instance-template", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AWS_INSTANCE_TEMPLATE", + "amiID": "ami-a0cfeed8", + "instanceType": "t2.large", + "subnetID": "subnet-12345678", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "publicKey": "my-public-key", + "associatePublicIPAddress": true + } + } + }, + "AzureRequestWithMarketplaceImageAndUsingExistingNic": { + "value": { + "metadata": { + "name": "my-azure-template-for-standard-A1", + "description": "Azure Instance Template for Standard A1", + "displayName": "Standard_A1-instance-template", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + } + } + }, + "AzureRequestWithCustomImageAndCreatingNewNicAndPublicIP": { + "value": { + "metadata": { + "name": "my-azure-template-for-standard-DS1_v2", + "description": "Azure Instance Template for Standard DS1v2", + "displayName": "DS1_v2-instance-template", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_ID", + "imageID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myCustomImageID" + }, + "instanceType": "Standard_DS1_v2", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_CONFIG", + "virtualNetwork": "my-virtual-network", + "subnet": "my-subnet", + "securityGroup": "my-network-sg", + "publicIp": true + } + } + } + }, + "AWSResponse": { + "value": { + "currentStatus": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "desiredState": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/location-1/instance-templates/my-instance-template" + }, + "name": "my-instance-template", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + }, + "AzureResponse": { + "value": { + "currentStatus": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "Azure Instance Template for Standard A1", + "displayName": "Standard_A1-instance-template", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/azure-westus2/instance-templates/my-azure-template-for-standard-A1" + }, + "name": "my-azure-template-for-standard-A1", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + }, + "AWSListResponse": { + "value": { + "items": [ + { + "currentStatus": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "desiredState": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/location-1/instance-templates/my-instance-template" + }, + "name": "my-instance-template", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + ] + } + } + }, + "responses": { + "BadRequest": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Unauthorized": { + "description": "User authentication is invalid or missing.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotFound": { + "description": "The specified instance group resource was not found.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Conflict": { + "description": "The request failed due to a conflict with an existing instance group resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotAllowed": { + "description": "The request is not allowed on the specified resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 120322, + "message": "Error deleting the location: the name 'unspecified' is reserved. Specify a different name for the location, then try again." + } + } + } + } + } + } +} diff --git a/static/controller/api/ctlr-analytics-openapi.json b/static/controller/api/ctlr-analytics-openapi.json new file mode 100644 index 000000000..10381247a --- /dev/null +++ b/static/controller/api/ctlr-analytics-openapi.json @@ -0,0 +1,2461 @@ +{ + "openapi": "3.0.3", + "info":{ + "title": "NGINX Controller Analytics REST API", + "version": "v1", + "description": "Use the NGINX Controller Analytics API to get information about your system and application performance." + }, + "servers": [ + { + "description": "NGINX Controller API", + "url": "https://{{CONTROLLER_FQDN}}/api/v1" + }], + "tags": [ + { + "name": "Alerts", + "description": "Use the Alerts API to manage the Alert Rule resources and retrieve information about the Alerts." + }, + { + "name": "Catalogs", + "description": "Use the Catalogs API to find out about the Metrics and Dimensions that you can use to refine your Analytics data queries." + }, + { + "name": "Events", + "description": "Use the Events API to retrieve information about system Events." + }, + { + "name": "Forwarders", + "description": "Use the Forwarders API to forward data (metrics, events) to external services." + }, + { + "name": "Metrics", + "description": "Use the Metrics API to retrieve system Metrics." + } + ], + "paths": { + "/analytics/alerts/rules": { + "get": { + "tags": [ + "Alerts" + ], + "summary": "List all Alert Rules", + "operationId": "listAlertRules", + "x-f5-experimental": true, + "description": "Returns a list of all the Alert Rule resources.", + "responses": { + "200": { + "description": "Successfully retrieved a list of all the Alert Rule resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Alerts" + ], + "summary": "Create an Alert Rule", + "description": "Creates a new Alert Rule resource.", + "operationId": "createAlertRule", + "x-f5-experimental": true, + "requestBody": { + "description": "Defines the Alert Rule resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Alert Rule resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/alerts/rules/{alertRuleName}": { + "parameters": [ + { + "name": "alertRuleName", + "description": "Identifies the Alert Rule resource.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "get": { + "tags": [ + "Alerts" + ], + "summary": "Get an Alert Rule", + "description": "Returns information for the specified Alert Rule.", + "operationId": "getAlertRule", + "x-f5-experimental": true, + "responses": { + "200": { + "description": "Successfully returned the requested Alert Rule resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Alerts" + ], + "summary": "Upsert an Alert Rule", + "description": "Creates a new Alert Rule or updates an existing Alert Rule resource.", + "operationId": "updateAlertRule", + "x-f5-experimental": true, + "requestBody": { + "description": "Defines the Alert Rule resource to create or the updates to make.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Alert Rule resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "201": { + "description": "Successfully created the specified Alert Rule resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Alerts" + ], + "summary": "Delete an Alert Rule", + "description": "Deletes the specified Alert Rule resource.", + "operationId": "deleteAlertRule", + "x-f5-experimental": true, + "responses": { + "204": { + "description": "Successfully deleted the specified Alert Rule resource." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/alerts/rules/{alertRuleName}/alerts": { + "parameters": [ + { + "name": "alertRuleName", + "description": "Identifies the Alert Rule resource.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "get": { + "tags": [ + "Alerts" + ], + "summary": "Get ongoing Alerts", + "description": "Returns information about Alerts for the specified Alert Rule.", + "operationId": "getAlerts", + "x-f5-experimental": true, + "responses": { + "200": { + "description": "Successfully returned the requested Alerts.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Alert" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/alerts/rules/{alertRuleName}/alerts/{alertId}": { + "parameters": [ + { + "name": "alertRuleName", + "description": "Identifies the Alert Rule resource.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "alertId", + "description": "Identifies the Alert resource.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "get": { + "tags": [ + "Alerts" + ], + "summary": "Get Alert", + "description": "Returns information about the requested Alert for the specified Alert Rule.", + "operationId": "getAlert", + "responses": { + "200": { + "description": "Successfully returned the requested Alert.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Alert" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/catalogs/metrics": { + "get": { + "tags": [ + "Catalogs" + ], + "summary": "List the Metrics Catalog", + "operationId": "listMetricsDescriptions", + "description": "Lists all of the Metric resources in the Catalog.\n\nThe Metrics Catalog contains the definitions for all of the available NGINX and NGINX Controller Agent metrics.\nYou can use the Catalogs API to find information about the available Metrics, then use those Metrics to refine your Analytics data queries.\n", + "responses": { + "200": { + "description": "Successfully returned the Metrics Catalog list.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListMetricsDescriptionsResponse" + } + } + } + } + } + } + }, + "/analytics/catalogs/metrics/{metricName}": { + "get": { + "tags": [ + "Catalogs" + ], + "summary": "Get a Metric Description", + "operationId": "getMetricDescription", + "description": "Gets the description of the specified Metric.\n", + "parameters": [ + { + "in": "path", + "name": "metricName", + "description": "Name of the Metric resource.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Successfully returned the requested Metric resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetricDescriptionResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Metric resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/catalogs/dimensions": { + "get": { + "tags": [ + "Catalogs" + ], + "summary": "List the Dimensions Catalog", + "operationId": "listDimensionsDescriptions", + "description": "Lists all of the Dimension resources in the Catalog.\n\nDimensions provide a means of refining the data returned by metrics and events queries.\nYou can use the List Dimensions Catalog endpoint to find out what Dimensions are available.\nThen, use the Get a Dimension endpoint to find out more about a specific dimension.\n", + "responses": { + "200": { + "description": "Successfully returned the requested Dimension resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListDimensionsDescriptionsResponse" + } + } + } + } + } + } + }, + "/analytics/catalogs/dimensions/{dimensionName}": { + "get": { + "tags": [ + "Catalogs" + ], + "summary": "Get a Dimension Description", + "operationId": "getDimensionDescription", + "description": "Gets the description of the specified Dimension resource.\n", + "parameters": [ + { + "in": "path", + "name": "dimensionName", + "description": "Name of the Dimension", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Successfully returned the requested Dimension resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetDimensionDescriptionResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Dimension resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/events": { + "get": { + "tags": [ + "Events" + ], + "summary": "Get Events", + "operationId": "queryEvents", + "description": "Returns a list of system Events.", + "parameters": [ + { + "name": "startTime", + "in": "query", + "description": "Indicates the start of the time window to include Events from (inclusive).\n\n- Must be provided if `endTime` was specified.\n- If you do not set 'startTime`, the most recent 100 Events will be returned.\n- `startTime` and `endTime` can be formatted as Event IDs (UUID format). If you use this format for any boundary, the validity of that boundary (for example, if endTime is greater than startTime) will not be checked.\n", + "schema": { + "$ref": "#/components/schemas/Time" + } + }, + { + "name": "endTime", + "in": "query", + "description": "Indicates the end of the time window to include Events from (non-inclusive).\n\n- Must be greater than `startTime`.\n- Must be provided if `startTime` was specified.\n", + "schema": { + "$ref": "#/components/schemas/Time" + } + }, + { + "name": "filter", + "in": "query", + "description": "Filters results based on dimension values.\n\nConsists of one or more predicates in the form `` where:\n- `` is the name of the dimension,\n- `` is one of the supported operators (`=`, `!=`, `<`, `<=`, `>=` `>`, `in` or `not`)\n- `` is the value of the dimension(s) that you want to filter on,\n- ` and ` are case sensitive.\n\nFor example: 'count > 100'\n\nPredicates can be combined into logical expressions using `OR`, `AND`, and `(` `)`.\nFor matching values, wildcard (`*`) use is supported.\n\nWrapping predicates in single quotes is recommended to ensure that the full query string is processed correctly.\n", + "schema": { + "type": "string", + "example": "category IN ('agent','controller') AND level='debug' AND count > 100" + }, + "allowReserved": true + }, + { + "name": "orderBy", + "in": "query", + "description": "Indicates how the results will be ordered.\n\nConsists of at most three comma-separated clauses in the form `` or `` where:\n- `` is the name of the dimension.\n- `` is the order by which the specified dimension will be sorted. Valid sort order is either \"ASC\" for ascending order, or \"DESC\" for descending order. If no sort order is provided, the default one (\"ASC\") will be used.\n\nNote that if no orderBy is provided, the default combination of descending \"timestamp\" and ascending \"id\" will be used regardless. If you provide different order for \"timestamp\" or \"id\" in orderBy, the default one will be overwritten.\n", + "schema": { + "type": "string", + "example": "name ASC,timestamp DESC" + } + }, + { + "name": "page", + "in": "query", + "description": "page number", + "required": false, + "schema": { + "type": "integer", + "default": 1, + "example": 1 + } + }, + { + "name": "pageToken", + "in": "query", + "description": "Transactional token used for pagination.\n\nThe token ensures consistency of the query results across requests for various pages of data. It provides a snapshot of the database contents from the time at which the query was received.\n\nIf `pageToken` is not provided with a page request, a token is automatically generated and will be returned in the response metadata. You should include the token in subsequent requests for pages in the query results.\n\nSending a query without a `pageToken` refreshes the query results.\n", + "schema": { + "type": "string", + "example": "1573653786" + } + }, + { + "name": "pageSize", + "in": "query", + "description": "Defines the number of returned items per page.\n\n- The maximum value is 100. If value is greater, it is automatically set down to 100.\n- If `pageSize`=0, pagination is disabled and all Events will be returned in response.\n- The response size is limited to 10,000 results. If the number of results exceeds 10,000 a warning is returned.\n", + "schema": { + "type": "integer", + "default": 100, + "example": 10 + } + }, + { + "name": "includeTotal", + "in": "query", + "description": "Defines if the Metadata should include the total count of events.\n", + "schema": { + "type": "boolean", + "default": false, + "example": true + } + } + ], + "responses": { + "200": { + "description": "Successfully returned the requested Events.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EventQueryResult" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/events/{id}": { + "get": { + "tags": [ + "Events" + ], + "summary": "Get an Event", + "operationId": "queryEventsById", + "description": "Returns the specified Event.", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Identifies the Event that you want to retrieve.", + "required": true, + "schema": { + "type": "string", + "example": "00112233-4455-6677-8899-aabbccddeeff" + } + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Event.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Event" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/forwarders": { + "post": { + "tags": [ + "Forwarders" + ], + "summary": "Create a Forwarder", + "description": "Creates a new Forwarder resource.", + "operationId": "createForwarder", + "requestBody": { + "description": "Contains the desired settings for the Forwarder resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "responses": { + "202": { + "description": "The request to create a Forwarder resource succeeded. The resource will be created when the configuration is complete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "get": { + "tags": [ + "Forwarders" + ], + "summary": "Get a list of Forwarders.", + "description": "Returns a list of all Forwarder resources.", + "operationId": "listForwarders", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Forwarder resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForwarderListResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/analytics/forwarders/{forwarderName}": { + "get": { + "tags": [ + "Forwarders" + ], + "summary": "Get a Forwarder", + "operationId": "getForwarder", + "description": "Gets information about an existing Forwarder resource.", + "parameters": [ + { + "$ref": "#/components/parameters/ForwarderName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Forwarder resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Forwarders" + ], + "summary": "Create or update a Forwarder", + "description": "Creates new or updates an existing Forwarder resource.", + "operationId": "updateForwarder", + "requestBody": { + "description": "Contains the desired settings for the Forwarder resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/ForwarderName" + } + ], + "responses": { + "202": { + "description": "Successfully initialized the update process of a Forwarder resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "Forwarders" + ], + "summary": "Delete a Forwarder", + "operationId": "deleteForwarder", + "description": "Deletes a Forwarder resource.", + "parameters": [ + { + "$ref": "#/components/parameters/ForwarderName" + } + ], + "responses": { + "202": { + "description": "The request to delete a Forwarder resource succeeded. The resource is marked for deletion.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/analytics/metrics": { + "get": { + "tags": [ + "Metrics" + ], + "summary": "Get Metrics", + "operationId": "queryMetrics", + "description": "Returns system Metrics data based on the query parameters provided.\n\nSupports filtering based on name and/or timestamp; aggregation over a configurable time span; and grouping by dimension.\n", + "parameters": [ + { + "name": "names", + "in": "query", + "description": "Identifies the Metrics data that you want to receive.\n\n- Provide multiple names as a comma-separated list.\n- You can provide an aggregate function for each Metric (`AVG`, `SUM`, `COUNT`, `MAX`, `MIN`, or `RATE`).\n- Combining non-aggregated and aggregated Metrics in a single query would apply any `groupBy` clause to only the latter.\n- Metrics with aggregates require the `startTime` parameter.\n", + "required": true, + "schema": { + "type": "string", + "example": "AVG(controller.agent.cpu.system),SUM(plus.upstream.bytes_rcvd)" + } + }, + { + "name": "startTime", + "in": "query", + "description": "Indicates the start of the time window to include Metrics from (inclusive).\n\n- If `startTime` is omitted, the last recorded value for the queried Metrics will be returned.\n- For aggregated Metrics, you must provide `startTime` in order to calculate the resolution.\n", + "schema": { + "$ref": "#/components/schemas/Time" + }, + "example": "now-5h" + }, + { + "name": "endTime", + "in": "query", + "description": "Indicates the end of the time window to include Metrics from (non-inclusive).\n\n- Must be greater than `startTime`.\n- If `endTime` is not specified when `startTime` is present, `endTime` defaults to the current time.\n", + "schema": { + "$ref": "#/components/schemas/Time" + } + }, + { + "name": "resolution", + "in": "query", + "description": "Changes the granularity of the returned data.\n\n- Must be a valid duration -- a string starting with a number followed by a unit of time (`y`, `M`, `w`, `d`, `h`, `m` or `s`).\n- When using a resolution, you must provide an aggregate function (or functions) in the `names` parameter and `startTime`.\n- If you do not provide a resolution, the maximum available resolution will be returned (`endTime` - `startTime`).\n", + "schema": { + "type": "string", + "example": "30s" + } + }, + { + "name": "filter", + "in": "query", + "description": "Filters results based on dimension values.\n\nConsists of one or more predicates in the form `` where:\n- `` is the name of the dimension.\n- `` is one of the supported operators (`=`, `!=`, `<`, `<=`, `>=` `>`, `in` or `not`).\n- `` is value of the dimension(s) that you want to filter on.\n- ` and ` is case sensitive.\n\nFor example: 'count > 100'\n\nPredicates can be combined into logical expressions using `OR`, `AND`, and `(` `)`.\nFor matching values, wildcard (`*`) use is supported.\n\nWrapping predicates in single quotes is recommended to ensure that the full query string is processed correctly.\n\nSee the Dimensions [Catalog](#/tags/catalogs) to find out more about Dimensions.\n", + "schema": { + "type": "string", + "example": "((app!='app1' OR app='app2') AND environment in ('aa', 'bb')) AND (tags!='*tag1*' AND interface='ens*')" + } + }, + { + "name": "groupBy", + "in": "query", + "description": "Groups the results according to the specified dimension(s).\n\n- Provide multiple dimension names as a comma-separated list.\n- All Metric names that you pass into the `names` parameter must be aggregated for the `groupBy` to work.\n", + "schema": { + "type": "string", + "example": "app,environment" + } + }, + { + "name": "seriesLimit", + "in": "query", + "description": "Sets an upper limit on the number of series returned.\nAlways returns additional series with dimension value named `all` (aggregating the values of all the metrics included in the results).\nIf the result does not include `all` stored dimensions values, the Metrics query returns series with dimension value named `other` (aggregating the values of all the metrics not included in the results).\nHas to be used along with the `orderSeriesBy` parameter.\n\n- Exactly one groupBy parameter must be provided in the query\n- Cannot be used along with `dimensions` parameter.\n", + "schema": { + "type": "integer", + "example": 25 + } + }, + { + "name": "orderSeriesBy", + "in": "query", + "description": "Sorts the results according to the order specified. \n\nUsed along with the `seriesLimit` parameter.\n", + "schema": { + "type": "string", + "example": "MAX DESC", + "default": "SUM DESC" + } + }, + { + "name": "dimensions", + "in": "query", + "description": "List of dimensions that should be returned in the response for each metric series.\n\nDimensions not specified in this parameter will be hidden in the results.\nThis might result in series having exact same dimension set, but being visible as separate.\n\nIf the `aggregation` and `groupBy` parameters are provided for a metric, any dimension provided in\nthe `dimensions` query parameter also has to be provided in the `groupBy` parameter.\n\nDimensions provided in the `groupBy` query parameter do not have to be provided in the `dimensions` query parameter.\n\n- To get a single series, provide the metric name with aggregation and the dimensions parameter with an empty value.\n- Cannot be used along with `seriesLimit`.\n", + "schema": { + "type": "string", + "example": "app,environment" + } + } + ], + "responses": { + "200": { + "description": "Successfully returned the requested Metrics data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetricQueryResult" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + } + }, + "components": { + "securitySchemes": { + "cookieAuth": { + "type": "apiKey", + "in": "cookie", + "name": "session" + } + }, + "responses": { + "BadRequest": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Unauthorized": { + "description": "User authentication is invalid or missing.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Forbidden": { + "description": "The request failed due to insufficient privileges.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Internal": { + "description": "The request cannot be processed because of an internal server error.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotFound": { + "description": "The requested resource was not found or is unavailable.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Conflict": { + "description": "The request failed due to a conflict with an existing resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + }, + "parameters": { + "ForwarderName": { + "in": "path", + "name": "forwarderName", + "schema": { + "type": "string" + }, + "required": true, + "description": "The name of the Forwarder resource.\n" + } + }, + "schemas": { + "Alert": { + "title": "alert", + "type": "object", + "properties": { + "uid": { + "type": "string", + "format": "uuid" + }, + "dimensions": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "startedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp when the Alert started." + }, + "startedValue": { + "type": "number", + "description": "Value of the metric that caused the Alert to start." + }, + "lastCheckedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp when the Alert was last checked." + }, + "lastCheckedValue": { + "type": "number", + "description": "Value of the metric when the Alert was last checked." + } + }, + "required": [ + "uid", + "dimensions", + "startedTimestamp", + "startedValue", + "lastCheckedTimestamp", + "lastCheckedValue" + ] + }, + "AlertRuleStatus": { + "title": "AlertRuleStatus", + "type": "object", + "properties": { + "alertsCount": { + "type": "integer", + "description": "Number of times an Alert for the Alert Rule has been started since creation." + }, + "status": { + "type": "string", + "enum": [ + "ok", + "ongoing" + ], + "description": "Alert Rule status:\n- `ok`: All the Alerts have expired or have never started.\n- `ongoing`: At least one Alert is currently ongoing.\n" + }, + "lastStartedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp when the Alert Rule transfered from 'ok' to 'ongoing' status." + }, + "lastExpiredTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp when the Alert Rule transfered from 'ongoing' to 'ok' status." + }, + "lastCheckedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp of the last successful check of the Alert Rule." + } + } + }, + "AlertRule": { + "title": "AlertRule", + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "userEmail": { + "type": "string", + "format": "email", + "readOnly": true, + "description": "Email of the user who created the Alert Rule." + }, + "metric": { + "type": "string", + "description": "A valid metric from the catalog.", + "example": "upstream.network.latency.max" + }, + "aggregation": { + "type": "string", + "description": "Aggregation of the metric over the configured period of time.", + "readOnly": true + }, + "filter": { + "type": "string", + "description": "The use of filter parameter limits the metrics data samples being taken into account for Alert Rule calculation\nto those matching the filter expression.\nFilter parameter syntax works the same as for `/analytics/metrics` API.\n\n- An empty filter parameter indicates that all collected data is going to be taken into account for Alert Rule calculation\n- `filter=app='myapp' AND (env='prod' or env='dev')` indicates that only samples related to desired app/env will be taken into account\n", + "example": "((app!='app1' OR app='app2') AND environment in ('dev', 'prod')) AND (tags!='*tag1*' AND interface='ens*')" + }, + "groupBy": { + "type": "string", + "description": "When `groupBy` is provided, alerts will be triggered for each distinct group of provided dimension(s).\nGroupBy parameter syntax works the same as for `/analytics/metrics` API.\n", + "example": "app,environment" + }, + "threshold": { + "type": "number", + "description": "Threshold to which the metric value will be compared to." + }, + "operator": { + "type": "string", + "enum": [ + "ge", + "le" + ], + "description": "Operator that defines which metric values will trigger an alert:\n\n- `ge`: metric value must be greater than or equal to the threshold in order to trigger an alert\n- `le`: metric value must be less than or equal to the threshold in order to trigger an alert\n" + }, + "period": { + "type": "string", + "example": "1h", + "description": "Period from which the metric aggregated value is calculated.\n\nMust be a valid duration - a string starting with a number followed by a unit of time (`h`, `m` or `s`).\n\n24h is the maximum allowed period.\n" + }, + "notificationType": { + "description": "Defines how notifications about triggered Alerts will be delivered to the user.", + "type": "string", + "enum": [ + "email" + ] + }, + "emailAddresses": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "format": "email", + "example": "user@example.com" + } + }, + "mute": { + "type": "boolean", + "description": "Indicates if the Alert Rule is muted. (Muted Alert Rules will not trigger notifications).", + "default": false + }, + "status": { + "$ref": "#/components/schemas/AlertRuleStatus", + "readOnly": true + } + }, + "required": [ + "metadata", + "metric", + "threshold", + "operator", + "period" + ] + }, + "SelfLinks": { + "type": "object", + "description": "The SelfLinks object contains a link from the resource to itself.\nThis object is used only in responses.\n", + "properties": { + "rel": { + "type": "string", + "example": "/api/v1/services/environments/prod", + "description": "`rel` contains the complete path fragment of a URI and can be used\nto construct a query to the object.\n" + } + } + }, + "ResourceMeta": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\*\\\"\\[\\]\\{\\}\\\\\\/%\\?:=&\\~\\^|#<>]+$", + "not": { + "type": "string", + "enum": [ + ".", + ".." + ] + }, + "minLength": 1, + "maxLength": 1024, + "example": "resource-name", + "description": "Resource name is a unique identifier for a resource within the context of a namespace.\nResource names must conform to [RFC 1738 Section 2.2](https://www.ietf.org/rfc/rfc1738.txt) and have a valid syntax for email addresses. The following rules are enforced:\n\n- do not utilize URL encoding;\n- do not include spaces;\n- do not use uppercase characters, for example, 'A-Z'; extended character sets are supported;\n- do not use the following characters: `\"`, `*`, `:`, `;`, `/`, `\\`, `%`, `?`, `hash`, `=`, `&`, `|`, `~`, `^`, `{`, `}`, `[`, `]`, `<`, `>`;\n- cannot start or end with an `@` sign;\n- cannot be only `.` or `..`\n\nFor example: For a collection resource located at\n\n`https://controller.example.com/api/v1/services/apps/shopping_@1`\n\nthe resource name is \"shopping_@1\".\n" + }, + "displayName": { + "type": "string", + "example": "My Display Name", + "description": "`displayName` is a user friendly resource name. It can be used to define \na longer, and less constrained, name for a resource.\n\nDisplay names:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "description": { + "type": "string", + "example": "This is a sample description string. It provides information about the resource.", + "description": "`description` is a free-form text property. You can use it to provide information that helps \nto identify the resource.\n\nDescriptions:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "kind": { + "type": "string", + "example": "-", + "description": "Kind is a string representation of an API resource's data type.\nIt is assigned by the server and cannot be changed. \n\nWhen creating a `kind`, the server uses hyphens to connect word segments; \nsingleton and collection item resources are not pluralized.\n" + }, + "uid": { + "type": "string", + "format": "uuid", + "example": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "description": "Unique Identifier (UID)\n\nUID is a unique identifier in time and space for a resource. \nWhen you create a resource, the server assigns a UID to the resource.\n\nRefer to [IETF RFC 4122](https://tools.ietf.org/html/rfc4122) for more information.\n" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ], + "description": "You can assign `tags` to a resource as a way to help map, scope, \nand organize resources. \n\nThe system uses tag selectors to specify selection criteria that \nmatch resources that have particular tags.\n" + }, + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "The `ref` field contains a reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/SelfLinks" + }, + "createTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was created.\n\nCreate time is not guaranteed to be set in \"happens-before\" order\nacross separate operations.\n\nIn JSON format, `create_time` type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n\nCreate Time is assigned by the server and cannot be changed.\n" + }, + "updateTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was last modified.\n\nResources that have never been updated do not have an `update_time` stamp.\n\nThe default value for resources that have never been updated is the local \nlanguage-specific equivalent of \"null\".\n\nIn JSON format, `update_time` type is encoded as a string as described in \n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n" + } + } + }, + "ErrorDetail": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "example": "Error doing : . This can lead to . Try to resolve the issue.", + "description": "A detailed error message returned by the server. \n\nThese messages contain the following information, where applicable:\n\n- What happened.\n- Why it happened.\n- What the consequences are (if any).\n- Recommended action to take to resolve the issue.\n" + } + } + }, + "ErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string", + "example": "Error doing .", + "description": "A human-readable message, in English, that describes the error.\n" + }, + "code": { + "type": "integer", + "example": 1234567, + "description": "A numeric error code that can be used to identify errors for support purposes.\n" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorDetail" + } + } + } + }, + "Time": { + "description": "Indicates a point in time.\n\nYou can provide time using ISO 8601 format or as an offset. An offset is a string that starts with `+` or `-`, followed by a number and a unit of time (`y`, `M`, `w`, `d`, `h`, `m` or `s`).\nExamples: \"2019-08-07T09:57:36.088757764Z\", \"now-3h\"\n", + "type": "string", + "example": "2019-08-07T09:57:36.088757764Z" + }, + "MetricQueryResult": { + "type": "object", + "properties": { + "queryMetadata": { + "$ref": "#/components/schemas/MetricQueryMetadata" + }, + "metrics": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metric" + } + }, + "responseMetadata": { + "$ref": "#/components/schemas/MetricResponseMetadata" + } + } + }, + "MetricResponseMetadata": { + "type": "object", + "properties": { + "warning": { + "type": "string" + } + } + }, + "MetricQueryMetadata": { + "type": "object", + "properties": { + "startTime": { + "type": "string", + "format": "date-time", + "example": "2019-08-07T09:57:36.088757764Z" + }, + "endTime": { + "type": "string", + "format": "date-time", + "example": "2019-08-07T09:57:36.088757764Z" + }, + "resolution": { + "type": "string", + "example": "30m" + } + } + }, + "Metric": { + "type": "object", + "description": "Metrics provide a means of measuring and analyzing the performance of your systems and of NGINX Controller.", + "properties": { + "name": { + "type": "string", + "example": "plus.upstream.response.count" + }, + "aggr": { + "type": "string", + "enum": [ + "AVG", + "COUNT", + "SUM", + "MAX", + "MIN", + "RATE" + ], + "example": "AVG" + }, + "series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Series" + } + } + } + }, + "Series": { + "type": "object", + "properties": { + "dimensions": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "example": { + "app": "app1", + "env": "prod" + } + }, + "timestamps": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + }, + "example": [ + "2019-08-07T09:57:30", + "2019-08-07T09:57:35" + ] + }, + "values": { + "type": "array", + "items": { + "type": "number" + }, + "example": [ + 4.2, + 4.4 + ] + } + } + }, + "ListMetricsDescriptionsResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MetricDescriptionRecord" + } + } + } + }, + "MetricDescriptionResponse": { + "$ref": "#/components/schemas/MetricDescriptionRecord" + }, + "MetricDescriptionRecord": { + "type": "object", + "required": [ + "metadata", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/MetricDescription" + } + } + }, + "MetricDescription": { + "type": "object", + "description": "The information record for a Metrics Catalog resource.", + "properties": { + "name": { + "type": "string", + "example": "nginx.http.request.bytes_sent" + }, + "description": { + "type": "string", + "example": "Number of bytes sent to clients." + }, + "unit": { + "type": "string", + "example": "bytes" + }, + "aggregations": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "AVG", + "COUNT", + "SUM", + "MAX", + "MIN" + ] + }, + "example": [ + "AVG", + "SUM" + ] + }, + "type": { + "type": "string", + "enum": [ + "counter", + "gauge", + "incremental" + ], + "example": "incremental" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "nginx", + "apimgmt_environment", + "apimgmt_definition", + "apimgmt_entry_point" + ], + "description": "An array of freeform strings containing the category(ies) of a Metrics Catalog resource." + }, + "dimensions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + }, + "description": "An array of the Dimensions that apply to a Metrics Catalog resource." + } + } + }, + "ListDimensionsDescriptionsResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DimensionDescriptionRecord" + } + } + } + }, + "GetDimensionDescriptionResponse": { + "$ref": "#/components/schemas/DimensionDescriptionRecord" + }, + "DimensionDescriptionRecord": { + "type": "object", + "required": [ + "metadata", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/DimensionDescription" + } + } + }, + "DimensionDescription": { + "type": "object", + "description": "The information record for a Dimensions Catalog resource.", + "properties": { + "name": { + "type": "string", + "example": "instance" + }, + "description": { + "type": "string", + "example": "Instance name." + }, + "type": { + "type": "string", + "enum": [ + "string", + "int", + "list" + ], + "example": "string" + }, + "metrics": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + }, + "description": "An array of the Metrics that the Dimensions resource applies to." + } + } + }, + "NamedLinks": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfLinks" + }, + { + "type": "object", + "description": "Contains information about the object being referred to.\n\nThese are generally details -- like the object name and display name --\nthat are useful to a consumer of the API that performs further\nprocessing. \n\nThis object is only present in responses.\n \n", + "properties": { + "name": { + "type": "string", + "example": "production", + "description": "The name of the linked resource.\n" + }, + "displayName": { + "type": "string", + "example": "Production Environment", + "description": "A user friendly resource name." + } + } + } + ] + }, + "ResourceRef": { + "type": "object", + "required": [ + "ref" + ], + "properties": { + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "A reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "EventQueryResult": { + "type": "object", + "properties": { + "Metadata": { + "$ref": "#/components/schemas/Metadata" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Event" + } + } + } + }, + "Event": { + "type": "object", + "description": "An Event is a system message.", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "example": "2019-08-07T09:57:36.088757764Z" + }, + "id": { + "type": "string", + "format": "uuid", + "example": "00112233-4455-6677-8899-aabbccddeeff" + }, + "message": { + "type": "string", + "example": "nginx stub_status detected, https://127.0.0.1:443/basic_status" + }, + "count": { + "type": "integer", + "example": 99 + }, + "category": { + "type": "string" + }, + "level": { + "type": "string", + "enum": [ + "DEBUG", + "INFO", + "WARNING", + "ERROR", + "CRITICAL" + ], + "example": "INFO" + }, + "hostname": { + "type": "string", + "example": "d0784771a503" + }, + "alias": { + "type": "string", + "example": "my_system" + }, + "status": { + "type": "string", + "example": "success" + }, + "error": { + "type": "string" + }, + "local_id": { + "type": "string", + "example": "d23c85484ee760ee5f4619c0434e1968b5290964487541da0889964eb783613c" + }, + "root_uuid": { + "type": "string", + "example": "759e842f6b9f51a7803f57da1e9f5ae8" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": "[\"tag1\", \"tag2\"]" + }, + "instance": { + "type": "string", + "example": "2" + }, + "location": { + "type": "string", + "example": "unspecified" + }, + "correlationId": { + "type": "string", + "example": "e5f355e4de82edd0afcd74ef6c1ee6aa" + }, + "http.request_endpoint": { + "type": "string", + "example": "/services/environments/dev/apps/app/components/25" + }, + "http.request_method": { + "type": "string", + "example": "POST" + }, + "user": { + "type": "string", + "example": "admin@nginx.test" + }, + "environment": { + "type": "string", + "example": "dev-environment" + }, + "app": { + "type": "string", + "example": "finance-app" + }, + "component": { + "type": "string", + "example": "secure-component" + }, + "gateway": { + "type": "string", + "example": "dev-gateway" + }, + "request_outcome": { + "type": "string", + "enum": [ + "REJECTED", + "PASSED" + ], + "example": "REJECTED" + }, + "request_outcome_reason": { + "type": "string", + "enum": [ + "SECURITY_WAF_OK", + "SECURITY_WAF_VIOLATION", + "SECURITY_WAF_FLAGGED", + "SECURITY_WAF_BYPASS", + "SECURITY_NGINX_VIOLATION", + "SECURITY_WAF_VIOLATION_TRANSPARENT" + ], + "example": "SECURITY_WAF_FLAGGED" + }, + "http.response_code": { + "type": "integer", + "example": 200 + }, + "http.hostname": { + "type": "string", + "example": "itay-108-117.f5net.com" + }, + "http.remote_addr": { + "type": "string", + "example": "127.0.0.1" + }, + "http.remote_port": { + "type": "integer", + "example": 4000 + }, + "http.server_addr": { + "type": "string", + "example": "0.0.0.0" + }, + "http.server_port": { + "type": "integer", + "example": 80 + }, + "http.request": { + "type": "string", + "example": "GET /test.exe HTTP/1.1\\r\\nUser-Agent: curl/7.29.0\\r\\nHost: localhost\\r\\nAccept: */*\\r\\n" + }, + "waf.support_id": { + "type": "string", + "example": "161339000577578694" + }, + "waf.signature_ids": { + "type": "string", + "example": "200001475,200000098" + }, + "waf.policy": { + "type": "string", + "example": "/Common/policy1" + }, + "waf.attack_types": { + "type": "string", + "example": "Non-browser Client,Abuse of Functionality,Cross Site Scripting (XSS)" + }, + "waf.violation_rating": { + "type": "string", + "enum": [ + "RISK_COULD_NOT_BE_DETERMINED", + "POSSIBLE_ATTACK", + "MOST_LIKELY_ATTACK" + ], + "example": "MOST_LIKELY_ATTACK" + }, + "waf.signature_names": { + "type": "string", + "example": "XSS script tag end (Parameter) (2),XSS script tag (Parameter)" + }, + "waf.is_truncated": { + "type": "string", + "example": "true" + }, + "waf.signature_cves": { + "type": "string", + "example": "CVE-2017-8759,CVE-2015-1641" + }, + "waf.sub_violations": { + "type": "string", + "example": "HTTP protocol compliance failed:Host header contains IP address" + }, + "waf.violations": { + "type": "string", + "example": "HTTP protocol compliance failed,Illegal meta character in value,Attack signature detected" + }, + "waf.x_forwarded_for_header_value": { + "type": "string", + "example": "87.233.120.158" + }, + "waf.bot_anomalies": { + "type": "string", + "example": "Search Engine Verification Failed" + }, + "waf.bot_category": { + "type": "string", + "example": "Search Engine" + }, + "waf.bot_client_class": { + "type": "string", + "example": "Malicious Bot" + }, + "waf.bot_signature_name": { + "type": "string", + "example": "Google" + }, + "waf.enforced_bot_anomalies": { + "type": "string", + "example": "Search Engine Verification Failed" + }, + "action_type": { + "type": "string", + "example": "login" + }, + "action_outcome": { + "type": "string", + "example": "success" + }, + "auth_provider.name": { + "type": "string", + "example": "local" + }, + "auth_provider.type": { + "type": "string", + "example": "BASIC" + }, + "resource_name": { + "type": "string", + "example": "datadog-forwarder" + }, + "big_ip_address": { + "type": "string", + "example": "https://87.233.120.158" + }, + "workload_health_state": { + "type": "string", + "example": "unhealthy" + } + } + }, + "Metadata": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/components/schemas/MetadataPagination" + } + } + }, + "MetadataPagination": { + "type": "object", + "required": [ + "pageToken" + ], + "properties": { + "pageToken": { + "type": "string", + "example": "1594048781" + }, + "links": { + "$ref": "#/components/schemas/PaginationLinks" + }, + "total": { + "type": "integer", + "example": 3600 + } + } + }, + "PaginationLinks": { + "type": "object", + "properties": { + "next": { + "$ref": "#/components/schemas/SelfLinks" + }, + "prev": { + "$ref": "#/components/schemas/SelfLinks" + } + } + }, + "Forwarder": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/DesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/CurrentStatus" + } + }, + "example": { + "metadata": { + "name": "splunk", + "displayName": "Splunk - Metrics", + "description": "Metrics forwarder going to Splunk HEC", + "kind": "forwarder", + "uid": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "links": { + "rel": "/api/v1/analytics/forwarders/splunk" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T10:12:33.001Z" + }, + "desiredState": { + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/new_splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + }, + "currentStatus": { + "state": { + "selfConfigState": { + "isConfigured": false, + "isConfiguring": true, + "isError": false, + "isDeleting": false, + "total": 1, + "configured": 0, + "configuring": 1, + "error": 0, + "deleting": 0 + } + }, + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + } + } + }, + "CurrentStatus": { + "type": "object", + "required": [ + "integrationRef", + "streams", + "state", + "collectorType" + ], + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "integrationRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "collectorType": { + "type": "string", + "enum": [ + "DATADOG", + "SPLUNK", + "SYSLOG", + "OTLP_HTTP", + "OTLP_GRPC" + ], + "description": "The type of Collector receiving forwarded data. The parameter sets the communication protocol\nand how the Forwarder monitors the liveness of the Collector.\n" + }, + "streams": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ForwarderStream" + } + } + } + }, + "DesiredState": { + "type": "object", + "required": [ + "integrationRef", + "streams", + "collectorType" + ], + "properties": { + "integrationRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "collectorType": { + "type": "string", + "enum": [ + "DATADOG", + "SPLUNK", + "SYSLOG" + ], + "description": "The type of Collector receiving forwarded data. The parameter sets the communication protocol\nand how the Forwarder monitors the liveness of the Collector.\n" + }, + "streams": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ForwarderStream" + } + } + } + }, + "ForwarderStream": { + "type": "object", + "required": [ + "outputFormat", + "inputDataType", + "selector" + ], + "description": "There is no global limitation on number of streams.\n\nWhen creating a Stream, be sure that the metrics you select are not already included in an existing Stream.\nWhen you add the same metrics to multiple Streams -- which is known as \"overlapping Streams\" -- you may see significant performance degradation and data duplication. The duplicated data may not be interpreted correctly by the Collector.\n", + "properties": { + "outputFormat": { + "type": "string", + "enum": [ + "SPLUNK", + "DATADOG", + "SYSLOG", + "OTLP" + ], + "description": "The format in which you want to send data to the Collector.\n", + "example": "SPLUNK" + }, + "inputDataType": { + "type": "string", + "enum": [ + "METRICS", + "EVENTS" + ], + "description": "The type of data that the stream is processing.", + "example": "METRICS" + }, + "selector": { + "type": "string", + "description": "The selector object limits the amount of data sent from NGINX Controller to the desired Collector.\nThe format of this parameter depends on the `inputDataType` value (either `METRICS` or `EVENTS`).\nAn empty selector indicates that all collected data is going to be forwarded to the Collector.\nEnsure sending all your data out of NGINX Controller does not cause additional charges.\n\n\nSelector elements and rules for `inputDataType`=`METRICS`:\nAllowed parameters: `excluded_names`, `names`, `filter`. The `filter` parameter and its behavior is not specific to `METRICS` `inputDataType`.\n\n`excluded_names` parameter consists of zero or more metric names that should not be forwarded\n`names` parameter consists of zero or more metric names that should be forwarded\nThe specific rules for these parameters are as follows:\n- if no value is provided or the only value is a wildcard (`*`), then all metric names will be forwarded.\n- if an explicit list of metric names is provided, all of these metrics will be forwarded.\n- any metric name can contain wildcard (`*`) character(s), in which case it will be resolved to all valid metrics that match the pattern.\n- `excluded_names` can be composed of metrics names and a wildcard (`*`) which should not be forwarded\n- any metric resolved from a `names` wildcard can be removed by an explicit or wildcard metric from `excluded_names`\n- any metric provided explicitly (full name without a wildcard) in the `names` parameter cannot be excluded by\n a wildcard or an explicit metric from the `excluded_names` parameter. That is, `names=system.cpu.idle&excluded_names=system.*`\n results in an error\n- `excluded_names` parameter is always applied after the resolution of the metrics from `names` parameter\n\nMake sure that all metrics provided in the `names` and `excluded_names` parameters resolve to an existing catalog metric or metrics.\n\nSample use:\n- `names=http.request.count, http.request.bytes_sent` indicates that only samples of those two metrics will be forwarded\n- `filter=app='myapp' & (env='prod' or env='dev')` indicates that only samples related to desired app/env will be forwarded,\nalso objects that does not contain filtered dimensions won't be sent\n- `names=http.request.count, http.request.bytes_sent&filter=app='myapp' AND (env='prod' or env='dev')` combines both above\n- `excluded_names=nginx.http.request.*` all metrics except matching `http.request.*` will be forwarded\n- `excluded_names=nginx.http.request.time.*&names=nginx.http.request.*` `excluded_names` can be combined\n with the `names` parameter to exclude metrics that were selected with a wildcard in the `names` parameters\n\n\nFiltering rules for `inputDataType`=`EVENTS`:\nAllowed parameters: `filter`. The `filter` parameter and its behavior is not specific to `EVENTS` `inputDataType`.\n\n\nFilter parameter:\nFilter parameter is shared between all supported data types and has the same behavior when used with any of them.\nIt consists of one or more predicates in the form `` where:\n- `` is the name of the dimension,\n- `` is one of the supported operators (`=`, `!=`, `<`, `<=`, `>=` `>`, `in` or `not`),\n- `` is value of the dimension(s) that you want to filter on,\n- ` and ` is case sensitive.\n\nFor example: 'count > 100'.\nPredicates can be combined into logical expressions using `OR`, `AND`, and `(` `)`.\nWrapping predicates in single quotes is recommended to ensure that the full query string is processed correctly.\n\nFor matching values, wildcard (`*`) use is supported.\n\nMake sure that all dimensions provided in the `filter` parameters resolve to an existing catalog dimension.\n\nAny expression with dimension not present in filtered metric/event will evaluate to `false`. This enables user\nto create filter which will forward metric/event with dimension not valid for particular metric/event but as whole filter expression\nwill evaluate to true and only parts will evaluate to false. Example:\n- `filter=file_path='/etc/hosts' OR instance='instance_name'` will forward `http.request.body_bytes_sent` as `file_path` dimension is invalid but whole expression will evaluate to true\n- `filter=file_path='/etc/hosts' AND instance='instance_name'` will not forward `http.request.body_bytes_sent` as `file_path` dimension is invalid and whole expression will always evaluate to false, but will forward `sytem.disk.used` which has both dimensions\n", + "example": "names=http.request.count,http.request.*,*latency*&filter=((app!='app1' OR app='app2') AND environment in ('aa', 'bb')) AND (tags!='*tag1*' AND interface='ens*')" + } + } + }, + "ForwarderListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Forwarder" + }, + "description": "List of Forwarder resources." + } + }, + "example": { + "items": [ + { + "metadata": { + "name": "splunk", + "displayName": "Splunk - Metrics", + "description": "Metrics forwarder going to Splunk HEC", + "kind": "forwarder", + "uid": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "links": { + "rel": "/api/v1/analytics/forwarders/splunk" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T10:12:33.001Z" + }, + "desiredState": { + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count" + } + ] + }, + "currentStatus": { + "state": { + "selfConfigState": { + "isConfigured": true, + "isConfiguring": false, + "isError": false, + "isDeleting": false, + "total": 1, + "configured": 1, + "configuring": 0, + "error": 0, + "deleting": 0 + }, + "conditions": [ + { + "type": "error", + "message": "integration reference not found" + } + ] + }, + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + } + }, + { + "metadata": { + "name": "splunk", + "displayName": "Splunk - Metrics", + "description": "Metrics forwarder going to Splunk HEC", + "kind": "forwarder", + "uid": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "links": { + "rel": "/api/v1/analytics/forwarders/splunk" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T10:12:33.001Z" + }, + "desiredState": { + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + }, + "currentStatus": { + "state": { + "selfConfigState": { + "isConfigured": true, + "isConfiguring": false, + "isError": false, + "isDeleting": false, + "total": 0, + "configured": 1, + "configuring": 0, + "error": 0, + "deleting": 0 + }, + "conditions": [ + { + "type": "error", + "message": "integration reference not found" + } + ] + }, + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + } + } + ] + } + }, + "ConfigStateTally": { + "type": "object", + "properties": { + "isConfigured": { + "type": "boolean", + "description": "The configuration operation is complete." + }, + "isConfiguring": { + "type": "boolean", + "description": "The configuration of the resource, or of its child(ren), is in process." + }, + "isError": { + "type": "boolean", + "description": "An error occurred while configuring the resource or its child(ren)." + }, + "isDeleting": { + "type": "boolean", + "description": "A delete operation is in progress for the resource or its child(ren)." + }, + "total": { + "type": "integer", + "description": "The total number of resources to which the configuration operation applies." + }, + "configured": { + "type": "integer", + "description": "The number of resources that have a complete and valid configuration." + }, + "configuring": { + "type": "integer", + "description": "The number of resources that are in the process of being configured." + }, + "error": { + "type": "integer", + "description": "The number of resources that have encountered an error during the configuration process." + }, + "deleting": { + "type": "integer", + "description": "The number of resources that are in the process of being deleted." + } + } + }, + "ConfigCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The condition type." + }, + "message": { + "type": "string", + "description": "A human-readable message that provides additional information about the configuration operation." + } + } + }, + "ConfigState": { + "type": "object", + "description": "A representation of the resource's current configuration state \nthat comprises the status of the resource itself (`selfConfigState`) and any child \nresources (`childrenConfigState`).\n\nThe conditions array provides additional information during configuration changes.\n", + "properties": { + "selfConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "childrenConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigCondition" + } + } + } + } + } + } +} diff --git a/static/controller/api/ctlr-apim-openapi.json b/static/controller/api/ctlr-apim-openapi.json new file mode 100644 index 000000000..d9deeb66e --- /dev/null +++ b/static/controller/api/ctlr-apim-openapi.json @@ -0,0 +1,12547 @@ +{ + "openapi": "3.0.3", + "info":{ + "title": "NGINX Controller API Management REST API", + "version": "v1", + "description": "Manage the NGINX Controller APIM module." + }, + "servers": [ + { + "description": "NGINX Controller API", + "url": "https://{{CONTROLLER_FQDN}}/api/v1" + }], + "tags": [ + { + "name": "Instances", + "description": "Use the Instances API to manage NGINX Controller Instance resources." + }, + { + "name": "API Definitions", + "description": "Use the \"API Definitions\" API to manage your APIs by using the NGINX Controller API Management module." + }, + { + "name": "Environments", + "description": "Use the Environments API to manage your Application Environments." + }, + { + "name": "Services", + "description": "Use the Services API to request a metadata list of a desired resource within a single environment or across all environments.\nSupported resources:\n - published-apis\n" + }, + { + "name": "DevPortals", + "description": "Use the DevPortals API to manage DevPortals resources." + }, + { + "name": "Instance Groups", + "description": "Use the Instance Groups API to manage a set of instances that can be used for scaling and high availability." + }, + { + "name": "Identity Providers", + "description": "Use the Identity Provider API to manage Identity providers in the API-M Credential Management partition." + }, + { + "name": "Certs", + "description": "Use the Certs API to manage the certificates used to secure your App traffic." + }, + { + "name": "Gateways", + "description": "Use the Gateways API to manage Gateway resources." + }, + { + "name": "Error Sets", + "description": "Use the Error Sets API to view the default predefined Error Sets." + }, + { + "name": "Published APIs", + "description": "Use the Published APIs API to manage your APIs by using the API Management module." + }, + { + "name": "Components", + "description": "Use the Components API to define child components (for example, microservices) for your Apps." + }, + { + "name": "Locations", + "description": "Use the Locations API to manage the deployment locations for NGINX Controller." + }, + { + "name": "Instance Templates", + "description": "Use the Instance Templates API to manage templates that can be used to deploy new NGINX Plus instances." + }, + { + "name": "Apps", + "description": "Use the Apps API to manage App resources." + }, + { + "name": "Integrations", + "description": "Use the Integrations API to manage integrated cloud provider accounts." + }, + { + "name": "Policies", + "description": "Use the Policies API to manage the policies used to secure your App traffic." + } + ], + "paths": { + "/infrastructure/instance-groups": { + "get": { + "tags": [ + "Instance Groups" + ], + "summary": "List Instance Groups", + "description": "Returns an unfiltered list of all Instance Group resources.", + "operationId": "listInstanceGroups", + "responses": { + "200": { + "description": "Successfully retieved a list of all the configured Instance Groups.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceGroupsResponse" + }, + "example": { + "value": { + "items": [ + { + "currentStatus": { + "instanceRefs": [], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "us-west-2 autoscale group", + "displayName": "aws-autoscale-group", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/amz-us-west-2-as-group" + }, + "name": "amz-us-west-2-as-group", + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Instance Groups" + ], + "summary": "Create an Instance Group", + "description": "Creates an new Instance Group resource.", + "operationId": "addInstanceGroup", + "requestBody": { + "description": "Defines the Instance Group resource to be added.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + }, + "example": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + } + } + } + }, + "responses": { + "202": { + "description": "The Instance Group resource has been accepted for creation. The Instance Group will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/instance-groups/{instanceGroupName}": { + "get": { + "tags": [ + "Instance Groups" + ], + "summary": "Get an Instance Group", + "description": "Returns information about a specified Instance Groupe resource.", + "operationId": "getInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Instance Group resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Instance Groups" + ], + "summary": "Upsert an Instance Group", + "description": "Creates a new Instance Group resource or updates an existing Instance Group resource.", + "operationId": "upsertInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + }, + "example": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "The Instance Group resource has been accepted for creation or update.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "delete": { + "tags": [ + "Instance Groups" + ], + "summary": "Delete an Instance Group", + "description": "Deletes the specified Instance Group resource.", + "operationId": "deleteInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Instance Group resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations": { + "get": { + "tags": [ + "Locations" + ], + "summary": "List all Locations", + "description": "Returns a list of all Locations.", + "operationId": "listLocations", + "responses": { + "200": { + "description": "Successfully retrieved a list of all of the configured Locations.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListLocationResponse" + }, + "example": { + "value": { + "items": [ + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "Location for instances where location has not been specified", + "displayName": "Unspecified (default)", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified" + }, + "name": "unspecified", + "tags": [ + "default" + ], + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Locations" + ], + "summary": "Create a Location", + "description": "Creates a new Location resource.", + "operationId": "addLocation", + "requestBody": { + "description": "Defines the Location resource to be added.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Location" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationRequest" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationRequest" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}": { + "get": { + "tags": [ + "Locations" + ], + "summary": "Get a Location", + "description": "Returns information about a specified Location resource.", + "operationId": "getLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Locations" + ], + "summary": "Upsert a Location", + "description": "Creates a new Location resource or updates an existing Location resource.", + "operationId": "upsertLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Location" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationRequest" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationRequest" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationRequest" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "201": { + "description": "Successfully updated the specified Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + } + } + }, + "delete": { + "tags": [ + "Locations" + ], + "summary": "Delete a Location", + "description": "Deletes the specified Location resource.", + "operationId": "deleteLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Location resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}/instances": { + "get": { + "tags": [ + "Instances" + ], + "summary": "List all Instances in a Location", + "description": "Returns the status and metadata for all of the Instances in the specified Location.", + "operationId": "listInstances", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully returned the status and metadata for all of the Instances in the specified Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceResponse" + }, + "examples": { + "INSTANCES": { + "$ref": "#/components/examples/ListInstanceResponse" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Instances" + ], + "summary": "Create an Instance", + "description": "Creates a new Instance resource.", + "operationId": "createInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + }, + "examples": { + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstanceRequest" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstanceRequest" + } + } + } + } + }, + "responses": { + "202": { + "description": "The Instance resource has been accepted for creation. The Instance will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + } + } + } + } + }, + "400": { + "description": "Bad input parameter or URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error creating the instance: could not parse the request payload. Check the format of the request, then try again.", + "code": 120647 + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing Instance resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error creating the instance: the instance already exists. Use a unique name for the instance, then try again.", + "code": 120652 + } + } + } + } + } + } + }, + "/infrastructure/locations/{locationName}/instances/{instanceName}": { + "get": { + "tags": [ + "Instances" + ], + "summary": "Get an Instance", + "description": "Returns the status and metadata for a single Instance.", + "operationId": "getInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "responses": { + "200": { + "description": "Successfully returned the details for an Instance.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/OtherInstance" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstance" + } + } + } + } + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error getting the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120603 + } + } + } + } + } + }, + "put": { + "tags": [ + "Instances" + ], + "summary": "Update an Instance", + "description": "Updates the description or display name of an existing Instance.", + "operationId": "updateInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the existing Instance.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/OtherInstance" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstance" + } + } + } + } + }, + "400": { + "description": "Bad input parameter or URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error updating the instance: could not parse the request payload. Check the format of the request, then try again.", + "code": 120612 + } + } + } + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error updating the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120614 + } + } + } + } + } + }, + "delete": { + "tags": [ + "Instances" + ], + "summary": "Delete an Instance", + "operationId": "deleteInstance", + "description": "Deletes the specified Instance.", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "responses": { + "202": { + "description": "Request for delete accepted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + } + } + } + }, + "204": { + "description": "Successfully deleted the Instance. No content is returned." + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error deleting the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120609 + } + } + } + }, + "409": { + "description": "Failed to delete the requested Instance resource.\n\nThe Instance is referenced by another resource. Remove the references to the Instance, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error deleting the instance: the NGINX instance is being configured. Try again later. If the problem persists, contact the system administrator.", + "code": 120640 + } + } + } + } + } + } + }, + "/infrastructure/locations/{locationName}/instance-templates": { + "get": { + "tags": [ + "Instance Templates" + ], + "summary": "List Instance Templates", + "description": "Returns an unfiltered list of all Instance Template resources in the specified Location.", + "operationId": "listInstanceTemplates", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved a list of all Instance Template resources for the specified Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceTemplateResponse" + }, + "examples": { + "INSTANCE_TEMPLATES": { + "$ref": "#/components/examples/AWSListResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Instance Templates" + ], + "summary": "Create an Instance Template", + "description": "Creates a new Instance Template resource.", + "operationId": "addInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "description": "Defines the Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceTemplate" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSRequest" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureRequestWithMarketplaceImageAndUsingExistingNic" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}/instance-templates/{instanceTemplateName}": { + "get": { + "tags": [ + "Instance Templates" + ], + "summary": "Get an Instance Template", + "description": "Gets information for the specified Instance Template resource.", + "operationId": "getInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Instance Templates" + ], + "summary": "Upsert an Instance Template", + "description": "Creates a new Instance Template resource or updates an existing Instance Template resource.", + "operationId": "upsertInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceTemplate" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSRequest" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureRequestWithCustomImageAndCreatingNewNicAndPublicIP" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully updated the specified Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "201": { + "description": "Successfully created the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + }, + "delete": { + "tags": [ + "Instance Templates" + ], + "summary": "Delete an Instance Template", + "description": "Deletes the specified Instance Template resource.", + "operationId": "deleteInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Instance Template resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/platform/integrations": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "List all Integrations", + "description": "Returns an unfiltered list of account Integrations.", + "operationId": "listIntegrations", + "x-f5-experimental": true, + "responses": { + "200": { + "description": "Successfully retreived all Integration accounts.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListIntegrationResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Integrations" + ], + "summary": "Create an Integration account", + "description": "Creates a new Integration account.", + "operationId": "addIntegration", + "x-f5-experimental": true, + "requestBody": { + "description": "Defines the Integration account to be added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing Integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/platform/integrations/{integrationName}": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get an Integration account", + "description": "Gets information about a specific Integration account.", + "operationId": "getIntegration", + "x-f5-experimental": true, + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "Integration not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Integrations" + ], + "summary": "Update an Integration account", + "description": "Updates an Integration account.", + "operationId": "updateIntegration", + "x-f5-experimental": true, + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "201": { + "description": "Successfully updated the specified Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Integrations" + ], + "summary": "Delete an Integration account", + "description": "Deletes the specified Integration account resource.", + "operationId": "deleteIntegration", + "x-f5-experimental": true, + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Integration resource." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/identity-providers": { + "get": { + "tags": [ + "Identity Providers" + ], + "summary": "List Identity Providers", + "description": "Returns a list of all Identity Provider resources.\n\n> **Note:** These resources were known as Client Groups in pre-3.x versions of NGINX Controller.\n", + "operationId": "identityProvidersSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of Identity Provider resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/identity-providers/{identityProviderName}": { + "get": { + "tags": [ + "Identity Providers" + ], + "summary": "Get an Identity Provider", + "description": "Returns the specified Identity Provider resource.", + "operationId": "identityProvidersGet", + "responses": { + "200": { + "description": "Successfully returnd the specified Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "403": { + "description": "The request failed due to insufficient privileges.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Providers" + ], + "summary": "Upsert an Identity Provider", + "description": "Creates a new Identity Provider, or creates an existing Identity Provider resource.\n", + "operationId": "identityProvidersPut", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + }, + "examples": { + "IdentityProviderRequest": { + "$ref": "#/components/examples/IdentityProviderRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "201": { + "description": "Successfully created the requested Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create an Identity Provider resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Identity Providers" + ], + "summary": "Delete an Identity Provider", + "description": "Deletes the specified Identity Provider resource.", + "operationId": "identityProvidersDelete", + "responses": { + "202": { + "description": "The Identity Provider resource has been marked for deletion. The resource will be deleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Identity Provider resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete an Identity Provider resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + } + ] + }, + "/security/identity-providers/{identityProviderName}/clients": { + "get": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "List Identity Provider Clients", + "description": "Returns a list of all Identity Provider Client resources.\n", + "operationId": "identityProviderClientsSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of Identity Provider Client resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Create Multiple Identity Provider Clients", + "description": "Creates or updates multiple Identity Provider Client resources.\n", + "operationId": "identityProviderClientsPutList", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + }, + "examples": { + "IdentityProviderClientListRequest": { + "$ref": "#/components/examples/IdentityProviderClientListRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully upserted the Identity Provider Client resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider Client resources and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The Identity Provider Client resource conflicts with another resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + } + ] + }, + "/security/identity-providers/{identityProviderName}/clients/{identityProviderClientName}": { + "get": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Get an Identity Provider Client", + "description": "Returns information for the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsGet", + "responses": { + "200": { + "description": "Successfully returned the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Update an Identity Provider Client", + "description": "Updates the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsPut", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + }, + "examples": { + "IdentityProviderClientRequest": { + "$ref": "#/components/examples/IdentityProviderClientRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "201": { + "description": "Successfully created the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider Client resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Update an Identity Provider Client", + "description": "Updates the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsPatch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIdentityProviderClient" + }, + "examples": { + "IdentityProviderClientPatchMetadataRequest": { + "$ref": "#/components/examples/IdentityProviderClientPatchMetadataRequest" + }, + "IdentityProviderClientPatchDesiredStateRequest": { + "$ref": "#/components/examples/IdentityProviderClientPatchDesiredStateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "202": { + "description": "Successfully accepted the request to update an Identity Provider Client resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Delete an Identity Provider Client", + "description": "Deletes the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsDelete", + "responses": { + "202": { + "description": "Identity Provider Client resource has been marked for deletion. The resource will be\ndeleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Identity Provider Client resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + }, + { + "$ref": "#/components/parameters/identityProviderClientName" + } + ] + }, + "/services": { + "x-f5-experimental": true, + "get": { + "tags": [ + "Services" + ], + "summary": "List the metadata for all instances of the desired resource.", + "description": "Returns a metadata list of the requested resource. The resources that can be queried is currently restricted to published-apis.\n", + "operationId": "listResources", + "responses": { + "200": { + "description": "Successfully retrieved a metadata list of the requested resource.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceMeta" + } + } + } + } + }, + "400": { + "description": "The resource defined in the query parameters could not be found or is not yet supported. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The environment defined in the query parameters could not be found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "resource", + "in": "query", + "description": "Desired resource to list.", + "required": true, + "style": "form", + "explode": false, + "schema": { + "type": "string", + "enum": [ + "published-apis" + ] + } + }, + { + "name": "environment", + "in": "query", + "description": "Filter desired resource based on the environment.", + "required": false, + "style": "form", + "explode": false, + "schema": { + "type": "string" + } + } + ] + }, + "/services/api-definitions": { + "get": { + "tags": [ + "API Definitions" + ], + "summary": "List API Definitions", + "description": "Returns a list of API Definition resources.", + "operationId": "apiDefinitionsSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of all API Definitions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionList" + } + } + } + } + } + } + }, + "/services/api-definitions/{apiDefinitionName}": { + "get": { + "tags": [ + "API Definitions" + ], + "summary": "Get an API Definition", + "description": "Gets information about a specified API Definition.\n", + "operationId": "apiDefinitionsGet", + "responses": { + "200": { + "description": "Successfully returned the specified API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "404": { + "description": "The specified API Definition resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definitions" + ], + "summary": "Upsert an API Definition", + "description": "Creates a new API Definition or updates an existing API Definition resource.\n", + "operationId": "apiDefinitionsPut", + "requestBody": { + "description": "Defines the API Definition resource to create, or the updates to apply to an existing API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definitions" + ], + "summary": "Delete an API Definition", + "description": "Deletes the specified API Definition resource.", + "operationId": "apiDefinitionsDelete", + "responses": { + "204": { + "description": "Successfully deleted the requested API Definition resource. No content is returned.\n" + }, + "404": { + "description": "The specified API Definition resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition resource. Delete any referenced Published APIs or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions": { + "get": { + "tags": [ + "API Definition Versions" + ], + "summary": "List API Definition Versions", + "description": "Lists all Versions for the specified API Definition resource.\n", + "operationId": "definitionVersionsSearch", + "responses": { + "200": { + "description": "Successfully retrieved the list of API Definition Version resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "404": { + "description": "The specified API Definition resource was not found or does not contain any Versions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definition Versions" + ], + "summary": "Add an API Definition Version", + "description": "Creates a single new API Definition Version resource or multiple Version resources.\n", + "operationId": "definitionVersionsPutList", + "requestBody": { + "description": "Creates, updates, or deletes an API Definition Version resource. It interacts with a list of items.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully received the request to create the API Definition Version resource(s).", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition Version resource(s) as it has at least one dependent Published API. Delete the referenced Published API(s), then try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definition Versions" + ], + "summary": "Delete API Definition Versions", + "description": "Deletes all Versions for the specified API Definition resource.\n", + "operationId": "definitionVersionsDeleteList", + "responses": { + "204": { + "description": "Successfully deleted the Versions for the requested API Definition resource. No content is returned.\n" + }, + "404": { + "description": "The specified API Definition resource was not found or does not contain any Versions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the Versions for the specified API Definition resource. Delete or remove any references to Published APIs, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions/{version}": { + "get": { + "tags": [ + "API Definition Versions" + ], + "summary": "Get an API Definition Version", + "description": "Gets information about an API Definition Version resource.\n", + "operationId": "definitionVersionsGet", + "responses": { + "200": { + "description": "Successfully returned the specified API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "404": { + "description": "The specified API Definition Version resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definition Versions" + ], + "summary": "Upsert an API Definition Version", + "description": "Creates a single new Version resource or updates an existing API Definition Version resource.\n", + "operationId": "definitionVersionsPut", + "requestBody": { + "description": "Creates or updates an API Definition Version resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definition Versions" + ], + "summary": "Delete an API Definition Version", + "description": "Deletes an API Definition Version resource.\n", + "operationId": "definitionVersionsDelete", + "responses": { + "204": { + "description": "Successfully deleted the API Definition Version resource.\n" + }, + "404": { + "description": "The specified API Definition Version resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition resource. Delete or remove any references to Published APIs, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + }, + { + "$ref": "#/components/parameters/versionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions/{version}/import": { + "put": { + "tags": [ + "API Definition Version Import" + ], + "summary": "Import an API Definition Version", + "description": "Imports an API spec to the specified Version of an API Definition.\n\nUse this endpoint to import a raw API specification to define your API.\n\n- This endpoint accepts a valid OpenAPI 3 spec, formatted as valid JSON or YAML.\n- The file provided for import will be validated against the\n [OAS v3 schema](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.yaml).\n- You must specify a \"Content-Type\" header when importing an API spec.\n The endpoint accepts the following \"Content-Type\" values:\n\n - application/json\n - application/yaml\n - text/x-yaml\n - application/x-yaml\n - text/yaml\n - application/xml\n - text/xml\n", + "operationId": "definitionVersionsImport", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + }, + "application/yaml": { + "schema": { + "type": "string" + } + }, + "text/x-yaml": { + "schema": { + "type": "string" + } + }, + "application/x-yaml": { + "schema": { + "type": "string" + } + }, + "text/yaml": { + "schema": { + "type": "string" + } + }, + "application/xml": { + "schema": { + "type": "string" + } + }, + "text/xml": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully completed the API Version Import request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition Version resource from the spec provided.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "415": { + "description": "The request body contains an unsupported content type.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + }, + { + "$ref": "#/components/parameters/versionName" + } + ] + }, + "/services/environments": { + "get": { + "tags": [ + "Environments" + ], + "summary": "List all Environments", + "description": "Returns a list of all Environment resources.\n", + "operationId": "listEnvironments", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Environment resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EnvironmentList" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Environments" + ], + "summary": "Create an Environment", + "description": "Creates a new Environment resource.\n", + "operationId": "createEnvironment", + "requestBody": { + "description": "Defines the Environment resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "202": { + "description": "The Environment resource has been accepted for creation. The Environment will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/services/environments/{environmentName}": { + "get": { + "tags": [ + "Environments" + ], + "summary": "Get an Environment", + "description": "Returns information for the specified Environment.\n", + "operationId": "getEnvironment", + "responses": { + "200": { + "description": "Successfully returned information for the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Environments" + ], + "summary": "Upsert an Environment", + "description": "Creates a new Environment or updates an existing Environment resource.\n", + "operationId": "updateEnvironment", + "requestBody": { + "description": "Defines the Environment to create or the updates to make to an existing Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "201": { + "description": "Successfully created the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "202": { + "description": "The Environment resource has been accepted for creation or update. The Environment will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Environments" + ], + "summary": "Delete an Environment", + "description": "Deletes the specified Environment resource.", + "operationId": "deleteEnvironment", + "responses": { + "202": { + "description": "The Environment resource has been marked for deletion. The Environment will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Environment resource. No content returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the requested Environment resource.\n\nThe Environment contains references to other objects. Delete the referenced objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/apps": { + "get": { + "tags": [ + "Apps" + ], + "summary": "List all Apps", + "description": "Returns a list of all App resources.\n", + "operationId": "listApps", + "responses": { + "200": { + "description": "Successfully retrieved a list of all App resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AppList" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Create an App", + "description": "Creates a new App resource.", + "operationId": "createApp", + "requestBody": { + "description": "An App.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "202": { + "description": "The App resource has been accepted for creation. The App will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get an App", + "description": "Gets the information for a specific App resource.\n", + "operationId": "getApp", + "responses": { + "200": { + "description": "Successfully retrieved information for the requested App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Apps" + ], + "summary": "Upsert an App", + "description": "Creates a new App resource or updates an existing App resource.\n", + "operationId": "updateApp", + "requestBody": { + "description": "Defines the App resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "201": { + "description": "Successfully created the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "202": { + "description": "The App resource has been accepted for creation or update. The App will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Delete an App", + "description": "Deletes the specified App resource.\n\nYou must delete all of an App's child resources before you delete the App.\n", + "operationId": "deleteApp", + "responses": { + "202": { + "description": "The App resource has been marked for deletion. The App will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified App resource.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified App resource failed.\nThe App contains references to active objects and cannot be deleted. Delete the child objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/components": { + "get": { + "tags": [ + "Components" + ], + "summary": "List all Components", + "description": "Returns a list of all of the Component resources that are contained by the specified App.\n", + "operationId": "listAppComponents", + "responses": { + "200": { + "description": "Successfully retrieved a list of Component resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComponentList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Components" + ], + "summary": "Create a Component", + "description": "Creates a new Component resource.\n", + "operationId": "createAppComponent", + "requestBody": { + "description": "Defines the Component resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + }, + "examples": { + "ComponentRequest": { + "$ref": "#/components/examples/ComponentRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "202": { + "description": "The Component resource has been accepted for creation. The Component will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to create a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/components/{componentName}": { + "get": { + "tags": [ + "Components" + ], + "summary": "Get a Component", + "description": "Returns information for the specified Component.\n", + "operationId": "getAppComponent", + "responses": { + "200": { + "description": "Successfully returned the requested Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Components" + ], + "summary": "Upsert a Component", + "description": "Creates a new Component or updates an existing Component resource.\n", + "operationId": "updateAppComponent", + "requestBody": { + "description": "Defines the Component resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + }, + "examples": { + "ComponentRequest": { + "$ref": "#/components/examples/ComponentRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "201": { + "description": "Successfully created the specified Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "202": { + "description": "The Component resource has been accepted for creation or update. The Component will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Components" + ], + "summary": "Delete a Component", + "description": "Deletes the specified Component resource.", + "operationId": "deleteAppComponent", + "responses": { + "202": { + "description": "Component resource has been marked for deletion. The resource will be\ndeleted after the underlying resources have been freed.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Component. No content returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + }, + { + "name": "componentName", + "description": "The name of the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ComponentName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/published-apis": { + "get": { + "tags": [ + "Published APIs" + ], + "summary": "List Published APIs", + "description": "Returns a list of all Published APIs for the specified Environment and App.\n", + "operationId": "listPublishedAPIs", + "responses": { + "200": { + "description": "Successfully retrieved the list of Published APIs for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPIList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/environmentName" + }, + { + "$ref": "#/components/parameters/appName" + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/published-apis/{publishedApiName}": { + "get": { + "tags": [ + "Published APIs" + ], + "summary": "Get a Published API", + "description": "Gets information about the specified Published API.\n", + "operationId": "getPublishedAPI", + "responses": { + "200": { + "description": "Successfully retrieved the specified Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Published API resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Published APIs" + ], + "summary": "Upsert a Published API", + "description": "Creates a new Published API or updates an existing Published API resource.", + "operationId": "upsertPublishedAPI", + "requestBody": { + "description": "Defines the Published API to create, or the updates to apply to an existing Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "201": { + "description": "Successfully created the requested Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "202": { + "description": "The request to create a Published API succeeded. The resource will be created when the configuration is complete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Published APIs" + ], + "summary": "Delete a Published API", + "description": "Deletes the specified Published API resource.", + "operationId": "deletePublishedAPI", + "responses": { + "202": { + "description": "Published API has been marked for deletion. The resource will be\ndeleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Published API resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Published API resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/environmentName" + }, + { + "$ref": "#/components/parameters/appName" + }, + { + "$ref": "#/components/parameters/publishedApiName" + } + ] + }, + "/services/environments/{environmentName}/certs": { + "get": { + "tags": [ + "Certs" + ], + "summary": "List all Certs", + "description": "Returns a list of Cert metadata objects for all of the Certs in the specified environment.", + "operationId": "listCerts", + "responses": { + "200": { + "description": "Successfully retrieved a list of Certs for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Certs" + ], + "summary": "Create a Cert", + "operationId": "createCert", + "description": "Creates a new Cert resource in the specified Environment.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cert" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/certs/{certName}": { + "get": { + "tags": [ + "Certs" + ], + "summary": "Get a Cert", + "operationId": "getCert", + "description": "Returns information for a specific Cert resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Cert.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Certs" + ], + "summary": "Upsert a Cert", + "operationId": "updateCert", + "description": "Creates a new Cert or updates an existing Cert resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cert" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Certs" + ], + "summary": "Delete a Cert", + "operationId": "deleteCert", + "description": "Deletes the specified Cert resource.", + "responses": { + "204": { + "description": "The specified Cert resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Cert resource failed.\nThe Cert is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "certName", + "description": "The name of the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/services/environments/{environmentName}/devportals": { + "get": { + "tags": [ + "DevPortals" + ], + "summary": "List all DevPortals", + "description": "Returns a list of all DevPortal resources.\n", + "operationId": "ListDevPortals", + "responses": { + "200": { + "description": "Successfully retrieved a list of all DevPortals resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DevPortalsList" + } + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "DevPortals" + ], + "summary": "Create DevPortal", + "description": "Creates new Dev Portal resource.", + "operationId": "CreateDevPortal", + "requestBody": { + "description": "A Dev Portal.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created a specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "202": { + "description": "Dev Portal resource has been accepted for creation. A Dev Portal will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the DevPortal.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/devportals/{devPortalName}": { + "get": { + "tags": [ + "DevPortals" + ], + "summary": "Get Dev Portal", + "description": "Gets the information for a specific Dev Portal resource.\n", + "operationId": "GetDevPortal", + "responses": { + "200": { + "description": "Successfully retrieved information for the requested Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "DevPortals" + ], + "summary": "Upsert Dev Portal", + "description": "Creates a new Dev Portal resource or updates an existing Dev Portal resource.\n", + "operationId": "UpsertDevPortal", + "requestBody": { + "description": "Defines a Dev Portal resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "201": { + "description": "Successfully created the specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "202": { + "description": "The Dev Portal resource has been accepted for creation or update. Dev Portal will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "DevPortals" + ], + "summary": "Delete a DevPortal", + "description": "Deletes the specified Dev Portal resource.\nYou must delete all of a Dev Portal's child resources before you delete the Dev Portal.\n", + "operationId": "DeleteDevPortal", + "responses": { + "202": { + "description": "The DevPortal resource has been marked for deletion. DevPortal will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified DevPortal resource.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified App resource failed.\nThe App contains references to active objects and cannot be deleted. Delete the child objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the DevPortal.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "devPortalName", + "description": "The name of the DevPortal.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "/services/environments/{environmentName}/gateways": { + "get": { + "tags": [ + "Gateways" + ], + "summary": "List all Gateways", + "description": "Returns a list of all Gateways in the specified Environment.\n", + "operationId": "listGateways", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Gateways for the specified Environment.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GatewayList" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Gateways" + ], + "summary": "Create a Gateway", + "description": "Creates a new Gateway resource.\n", + "operationId": "createGateway", + "requestBody": { + "description": "Defines the Gateway resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "202": { + "description": "The Gateway resource has been accepted for creation. The Gateway will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to create a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Gateway resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/gateways/{gatewayName}": { + "get": { + "tags": [ + "Gateways" + ], + "summary": "Get a Gateway", + "description": "Returns information for the specified Gateway resource.\n", + "operationId": "getGateway", + "responses": { + "200": { + "description": "Successfully retrieved the requested Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Gateways" + ], + "summary": "Upsert a Gateway", + "description": "Creates a new Gateway or updates an existing Gateway resource.\n", + "operationId": "updateGateway", + "requestBody": { + "description": "Defines the Gateway resource to create or the updates to make to an existing Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "201": { + "description": "Successfully created the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "202": { + "description": "The Gateway resource has been accepted for creation or update. The Gateway will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Gateways" + ], + "summary": "Delete a Gateway", + "description": "Deletes the specified Gateway resource.", + "operationId": "deleteGateway", + "responses": { + "202": { + "description": "The Gateway resource has been marked for deletion. The Gateway will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Gateway resource. No content is returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete a Gateway resource failed.\nThe Gateway is referenced by an App Component(s) and cannot be deleted.\nDelete the App Component or remove the reference, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Gateway resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "gatewayName", + "description": "The name of the Gateway.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/GatewayName" + } + } + ] + }, + "/services/errorsets": { + "get": { + "tags": [ + "Error Sets" + ], + "summary": "List all Error Sets.", + "description": "Returns a list of all the Error Sets.", + "operationId": "listErrorSets", + "responses": { + "200": { + "description": "Successfully retrieved a list of Error Sets.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorSetList" + } + } + } + } + } + } + }, + "/services/errorsets/{errorSetName}": { + "get": { + "tags": [ + "ErrorSets" + ], + "summary": "Get an Error Set.", + "operationId": "getErrorSet", + "description": "Returns the information for a specific Error Set.", + "responses": { + "200": { + "description": "Successfully retrieved the requested Error Set.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorSet" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "errorSetName", + "description": "The name of the Error Set.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/security/policies": { + "x-f5-experimental": true, + "get": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "List all Policies", + "description": "Returns a list of Policy metadata objects for all of the Policies.", + "operationId": "listPolicies", + "responses": { + "200": { + "description": "Successfully retrieved a list of Policies.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "Create a Policy", + "operationId": "createPolicy", + "description": "Creates a new Policy resource.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/policies/{policyName}": { + "get": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "Get a Policy", + "operationId": "getPolicy", + "description": "Returns information for a specific Policy resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Policy.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "Upsert a Policy", + "operationId": "updatePolicy", + "description": "Creates a new Policy or updates an existing Policy resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "Delete a Policy", + "operationId": "deletePolicy", + "description": "Deletes the specified Policy resource.", + "responses": { + "204": { + "description": "The specified Policy resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Policy resource failed.\nThe Policy is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "policyName", + "description": "The name of the Policy.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + } + }, + "components": { + "parameters": { + "LocationName": { + "name": "locationName", + "in": "path", + "description": "The name of the Location that contains the Instance.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceName": { + "name": "instanceName", + "in": "path", + "description": "The name of the Instance.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "environmentName": { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + "appName": { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + }, + "apiDefinitionName": { + "name": "apiDefinitionName", + "in": "path", + "description": "The name of the API Definition resource.", + "required": true, + "style": "simple", + "explode": false, + "example": "shopping-app-api-def", + "schema": { + "type": "string" + } + }, + "publishedApiName": { + "name": "publishedApiName", + "in": "path", + "description": "The name of the Published API resource.", + "required": true, + "style": "simple", + "explode": false, + "example": "shopping-app-api-staging", + "schema": { + "type": "string" + } + }, + "versionName": { + "name": "version", + "in": "path", + "description": "The Version of the API Definition.", + "required": true, + "style": "simple", + "explode": false, + "example": "v1_2fd4e1c6", + "schema": { + "type": "string" + } + }, + "InstanceGroupName": { + "name": "instanceGroupName", + "in": "path", + "description": "The name of the Instance Group.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "identityProviderName": { + "name": "identityProviderName", + "in": "path", + "description": "The name of the Identity Provider.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "identityProviderClientName": { + "name": "identityProviderClientName", + "in": "path", + "description": "The name of the Identity Provider Client.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceTemplateName": { + "name": "instanceTemplateName", + "in": "path", + "description": "The name of the Instance Template resource.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "IntegrationName": { + "name": "integrationName", + "in": "path", + "description": "The name of the Integration resource.", + "required": true, + "schema": { + "type": "string" + } + } + }, + "schemas": { + "SelfLinks": { + "type": "object", + "description": "The SelfLinks object contains a link from the resource to itself.\nThis object is used only in responses.\n", + "properties": { + "rel": { + "type": "string", + "example": "/api/v1/services/environments/prod", + "description": "`rel` contains the complete path fragment of a URI and can be used\nto construct a query to the object.\n" + } + } + }, + "ResourceMeta": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\*\\\"\\[\\]\\{\\}\\\\\\/%\\?:=&\\~\\^|#<>]+$", + "minLength": 1, + "maxLength": 1024, + "example": "resource-name", + "description": "Resource name is a unique identifier for a resource within the context of a namespace.\nResource names must conform to [RFC 1738 Section 2.2](https://www.ietf.org/rfc/rfc1738.txt) and have a valid syntax for email addresses. The following rules are enforced:\n\n- do not utilize URL encoding;\n- do not include spaces;\n- do not use uppercase characters, for example, 'A-Z'; extended character sets are supported;\n- do not use the following characters: `\"`, `*`, `:`, `;`, `/`, `\\`, `%`, `?`, `hash`, `=`, `&`, `|`, `~`, `^`, `{`, `}`, `[`, `]`, `<`, `>`;\n- cannot start or end with an `@` sign;\n\nFor example: For a collection resource located at\n\n`https://controller.example.com/api/v1/services/apps/shopping_@1`\n\nthe resource name is \"shopping_@1\".\n" + }, + "displayName": { + "type": "string", + "example": "My Display Name", + "description": "`displayName` is a user friendly resource name. It can be used to define \na longer, and less constrained, name for a resource.\n\nDisplay names:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "description": { + "type": "string", + "example": "This is a sample description string. It provides information about the resource.", + "description": "`description` is a free-form text property. You can use it to provide information that helps \nto identify the resource.\n\nDescriptions:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "kind": { + "type": "string", + "example": "-", + "description": "Kind is a string representation of an API resource's data type.\nIt is assigned by the server and cannot be changed. \n\nWhen creating a `kind`, the server uses hyphens to connect word segments; \nsingleton and collection item resources are not pluralized.\n" + }, + "uid": { + "type": "string", + "format": "uuid", + "example": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "description": "Unique Identifier (UID)\n\nUID is a unique identifier in time and space for a resource. \nWhen you create a resource, the server assigns a UID to the resource.\n\nRefer to [IETF RFC 4122](https://tools.ietf.org/html/rfc4122) for more information.\n" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ], + "description": "You can assign `tags` to a resource as a way to help map, scope, \nand organize resources. \n\nThe system uses tag selectors to specify selection criteria that \nmatch resources that have particular tags.\n" + }, + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "The `ref` field contains a reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/SelfLinks" + }, + "createTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was created.\n\nCreate time is not guaranteed to be set in \"happens-before\" order\nacross separate operations.\n\nIn JSON format, `create_time` type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n\nCreate Time is assigned by the server and cannot be changed.\n" + }, + "updateTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was last modified.\n\nResources that have never been updated do not have an `update_time` stamp.\n\nThe default value for resources that have never been updated is the local \nlanguage-specific equivalent of \"null\".\n\nIn JSON format, `update_time` type is encoded as a string as described in \n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n" + } + } + }, + "ResourceName": { + "type": "string", + "description": "The name of a resource.", + "example": "production" + }, + "ConfigStateTally": { + "type": "object", + "properties": { + "isConfigured": { + "type": "boolean", + "description": "The configuration operation is complete." + }, + "isConfiguring": { + "type": "boolean", + "description": "The configuration of the resource, or of its child(ren), is in process." + }, + "isError": { + "type": "boolean", + "description": "An error occurred while configuring the resource or its child(ren)." + }, + "isDeleting": { + "type": "boolean", + "description": "A delete operation is in progress for the resource or its child(ren)." + }, + "total": { + "type": "integer", + "description": "The total number of resources to which the configuration operation applies." + }, + "configured": { + "type": "integer", + "description": "The number of resources that have a complete and valid configuration." + }, + "configuring": { + "type": "integer", + "description": "The number of resources that are in the process of being configured." + }, + "error": { + "type": "integer", + "description": "The number of resources that have encountered an error during the configuration process." + }, + "deleting": { + "type": "integer", + "description": "The number of resources that are in the process of being deleted." + } + } + }, + "ConfigCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The condition type." + }, + "message": { + "type": "string", + "description": "A human-readable message that provides additional information about the configuration operation." + } + } + }, + "ConfigState": { + "type": "object", + "description": "A representation of the resource's current configuration state \nthat comprises the status of the resource itself (`selfConfigState`) and any child \nresources (`childrenConfigState`).\n\nThe conditions array provides additional information during configuration changes.\n", + "properties": { + "selfConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "childrenConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigCondition" + } + } + } + }, + "NamedLinks": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfLinks" + }, + { + "type": "object", + "description": "Contains information about the object being referred to.\n\nThese are generally details -- like the object name and display name --\nthat are useful to a consumer of the API that performs further\nprocessing. \n\nThis object is only present in responses.\n \n", + "properties": { + "name": { + "type": "string", + "example": "production", + "description": "The name of the linked resource.\n" + }, + "displayName": { + "type": "string", + "example": "Production Environment", + "description": "A user friendly resource name." + } + } + } + ] + }, + "ResourceRef": { + "type": "object", + "required": [ + "ref" + ], + "properties": { + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "A reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "ErrorDetail": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "example": "Error doing : . This can lead to . Try to resolve the issue.", + "description": "A detailed error message returned by the server. \n\nThese messages contain the following information, where applicable:\n\n- What happened.\n- Why it happened.\n- What the consequences are (if any).\n- Recommended action to take to resolve the issue.\n" + } + } + }, + "ErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string", + "example": "Error doing .", + "description": "A human-readable message, in English, that describes the error.\n" + }, + "code": { + "type": "integer", + "example": 1234567, + "description": "A numeric error code that can be used to identify errors for support purposes.\n" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorDetail" + } + } + } + }, + "EnvironmentName": { + "type": "string" + }, + "AppName": { + "type": "string" + }, + "Instance": { + "type": "object", + "description": "An NGINX Instance.", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceDesiredState" + } + } + }, + "GetInstanceResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Instance" + } + ] + }, + "ListInstanceResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Instance" + } + } + } + }, + "InstanceRequest": { + "allOf": [ + { + "$ref": "#/components/schemas/Instance" + } + ], + "description": "Describes the Instance to update." + }, + "InstanceDesiredState": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/AWSInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/AzureInstanceDesiredState" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_INSTANCE": "#/components/schemas/OtherInstanceDesiredState", + "AWS_INSTANCE": "#/components/schemas/AWSInstanceDesiredState", + "AZURE_INSTANCE": "#/components/schemas/AzureInstanceDesiredState" + } + } + }, + "InstanceCurrentStatus": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/AWSInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/AzureInstanceCurrentStatus" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_INSTANCE": "#/components/schemas/OtherInstanceCurrentStatus", + "AWS_INSTANCE": "#/components/schemas/AWSInstanceCurrentStatus", + "AZURE_INSTANCE": "#/components/schemas/AzureInstanceCurrentStatus" + } + } + }, + "OtherInstanceDesiredState": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "OTHER_INSTANCE is an Instance pre-installed and self-registered during NGINX installation.\n", + "enum": [ + "OTHER_INSTANCE" + ] + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "AWSInstanceDesiredState": { + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "AWS_INSTANCE is an Instance hosted in Amazon Web Services (AWS).\n", + "enum": [ + "AWS_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "AzureInstanceDesiredState": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "AZURE_INSTANCE is an Instance hosted in Microsoft Azure.", + "enum": [ + "AZURE_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "OtherInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the Other Instance.", + "required": [ + "type", + "hostname", + "version", + "agent", + "status", + "muted" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "OTHER_INSTANCE is an Instance pre-installed and self-registered during NGINX installation.\n", + "enum": [ + "OTHER_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/OtherNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "status": { + "deprecated": true, + "allOf": [ + { + "$ref": "#/components/schemas/ConfigState" + } + ] + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "AWSInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the AWS Instance.", + "required": [ + "type", + "hostname", + "version", + "agent", + "muted" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "AWS_INSTANCE is an Instance hosted in Amazon Web Services (AWS).\n", + "enum": [ + "AWS_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/AWSNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "AzureInstanceCurrentStatus": { + "x-f5-experimental": true, + "type": "object", + "description": "Contains the current status of the Azure Instance.", + "required": [ + "type", + "hostname", + "version", + "agent" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the mute status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "AZURE_INSTANCE is an Instance hosted in Microsoft Azure.", + "enum": [ + "AZURE_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/AzureNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "TemplateRef": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + } + ], + "description": "Reference to an existing Instance Template resource. This field cannot be updated." + }, + "LegacySystemMetadata": { + "type": "object", + "deprecated": true, + "description": "Metadata that describe the operating system attributes and properties of an Instance host system. It is\nintended for internal use only and is subject to change.\n", + "additionalProperties": true + }, + "LegacyNginxMetadata": { + "type": "object", + "deprecated": true, + "description": "Metadata that describe an Instance's NGINX process configuration and properties. It is intended\nfor internal use only and is subject to change.\n", + "additionalProperties": true + }, + "Agent": { + "type": "object", + "description": "The properties of the Controller Agent running on the Instance", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string", + "description": "The version of Controller Agent that is currently running on the Instance." + }, + "online": { + "type": "boolean", + "description": "The status of Controller Agent that is currently running on the Instance." + }, + "credentials": { + "$ref": "#/components/schemas/AgentCredentials" + } + } + }, + "AgentCredentials": { + "type": "object", + "description": "The credentials of the Controller Agent running on the Instance.", + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Agent." + }, + "uuid": { + "type": "string", + "description": "The uuid of the Agent." + } + } + }, + "OtherNetworkConfig": { + "type": "object", + "description": "The network config of a customer deployed Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OtherNetworkInterface" + } + } + } + }, + "OtherNetworkInterface": { + "type": "object", + "description": "A network interface for a customer deployed Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "privateDnsName": { + "type": "string", + "description": "The private, internal hostname of the instance, which resolves to the Instance's private IP address.\n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "privateIPv6": { + "type": "string", + "description": "The private IPv6 address of the network interface." + }, + "alternateIPList": { + "type": "array", + "items": { + "type": "string" + } + }, + "alternateIPv6List": { + "type": "array", + "items": { + "type": "string" + } + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "AWSNetworkConfig": { + "type": "object", + "description": "The network config of an AWS Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSNetworkInterface" + } + } + } + }, + "AWSNetworkInterface": { + "type": "object", + "description": "A network interface for an AWS Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "privateDnsName": { + "type": "string", + "description": "The private, internal hostname of the instance, which resolves to the Instance's private IP address. \n" + }, + "publicDnsName": { + "type": "string", + "description": "The public hostname of the instance, which resolves to the public IP address of the Instance. \n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "publicIP": { + "type": "string", + "description": "The public IP address of the network interface." + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "subnetID": { + "type": "string", + "description": "The ID of the subnet into which the instance was launched." + }, + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "AzureNetworkConfig": { + "type": "object", + "description": "The network config of an Azure Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureNetworkInterface" + } + } + } + }, + "AzureNetworkInterface": { + "type": "object", + "description": "A network interface associated with an Azure Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "publicDnsName": { + "type": "string", + "description": "The public hostname of the instance, which resolves to the public IP address of the Instance. \n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "publicIP": { + "type": "string", + "description": "The public IP address of the network interface." + }, + "privateIPv6": { + "type": "string", + "description": "The private IPv6 address of the network interface." + }, + "publicIPv6": { + "type": "string", + "description": "The public IPv6 address of the network interface." + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "subnetID": { + "type": "string", + "description": "The ID of the subnet that contains the Instance." + }, + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "Nginx": { + "type": "object", + "description": "Defines properties and configuration values for Nginx.\n", + "properties": { + "process": { + "$ref": "#/components/schemas/NginxProcess" + } + } + }, + "NginxProcess": { + "type": "object", + "description": "Defines configuration directives that are defined in the main configuration context.\n", + "properties": { + "user": { + "type": "string", + "description": "Defines user credentials used by worker processes.\n", + "default": "nginx" + }, + "group": { + "type": "string", + "description": "Defines group credentials used by worker processes. This will be ignored if the user\nproperty is not defined.\n", + "default": "nginx" + } + } + }, + "APIDefinition": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/APIDefinitionCurrentStatus" + } + } + }, + "APIDefinitionCurrentStatus": { + "type": "object", + "properties": { + "apiDefinitionVersionRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "APIDefinitionList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "APIDefinitionSpecMapping": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/RESTAPISpec" + }, + { + "$ref": "#/components/schemas/gRPCProxySpec" + }, + { + "$ref": "#/components/schemas/SOAPAPISpec" + } + ] + } + }, + "RESTAPISpec": { + "type": "object", + "description": "Validates an Imported OpenAPI 3 spec formatted as JSON using the [OAS v3 schema.yaml](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.yaml) specification.\n" + }, + "SOAPAPISpec": { + "type": "object", + "description": "Validates and Transforms an Imported WSDL spec.\n", + "properties": { + "wsdl": { + "type": "string" + }, + "soap-config": { + "$ref": "#/components/schemas/SoapConfig" + } + }, + "required": [ + "soap-config" + ] + }, + "SoapConfig": { + "type": "object", + "description": "Transformed WSDL to OpenAPI spec config.\n", + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "tns": { + "type": "string" + }, + "qualifiedFields": { + "type": "boolean" + }, + "endpoints": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/SoapConfigEndpoint" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/SoapConfigWSDLType" + } + }, + "messages": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/SoapConfigMessage" + } + } + }, + "required": [ + "name", + "url", + "tns", + "endpoints", + "types", + "messages", + "qualifiedFields" + ] + }, + "SoapConfigEndpoint": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "in": { + "type": "string" + }, + "out": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "restHTTPMethod": { + "type": "string", + "enum": [ + "get", + "head", + "post", + "put", + "patch", + "delete" + ] + }, + "restURI": { + "type": "string" + } + }, + "required": [ + "name", + "in", + "out", + "enabled", + "restHTTPMethod", + "restURI" + ] + }, + "SoapConfigMessage": { + "type": "object", + "description": "Validates and Transforms an Imported WSDL spec.\n", + "properties": { + "name": { + "type": "string" + }, + "parts": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/SoapConfigMessagePart" + } + } + }, + "required": [ + "name", + "parts" + ] + }, + "SoapConfigMessagePart": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "restName": { + "type": "string" + }, + "type": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "name", + "restName" + ] + }, + "SoapConfigWSDLType": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "properties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SoapConfigNestedWSDLType" + } + }, + "hasOneOfProperties": { + "type": "boolean" + }, + "hasOrderedProperties": { + "type": "boolean" + }, + "enum": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "name", + "type", + "hasOneOfProperties", + "hasOrderedProperties" + ] + }, + "SoapConfigNestedWSDLType": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "restName": { + "type": "string" + }, + "type": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "isRequired": { + "type": "boolean" + }, + "isArray": { + "type": "boolean" + } + }, + "required": [ + "name", + "restName", + "isRequired", + "isArray" + ] + }, + "gRPCProxySpec": { + "x-f5-experimental": true, + "type": "object", + "description": "Validates an Imported gRPC spec.\n" + }, + "APIDefinitionVersion": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/APIDefinitionVersionMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/APIDefinitionVersionDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/APIDefinitionVersionCurrentStatus" + } + } + }, + "APIDefinitionVersionList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "APIDefinitionVersionDesiredState": { + "type": "object", + "properties": { + "specs": { + "$ref": "#/components/schemas/APIDefinitionSpecMapping" + } + } + }, + "APIDefinitionVersionCurrentStatus": { + "type": "object", + "properties": { + "specs": { + "$ref": "#/components/schemas/APIDefinitionSpecMapping" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "apiDefinitionVersionRef": { + "type": "object", + "properties": { + "ref": { + "type": "string", + "description": "Reference to the Version of the API Definition.\n", + "example": "/services/api-definitions/baseball-stats/versions/v1" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "APIDefinitionVersionMeta": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceMeta" + }, + { + "type": "object", + "properties": { + "isDefaultVersion": { + "type": "boolean" + } + } + } + ] + }, + "EnvironmentList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "Environment": { + "type": "object", + "description": "An Environment is a logical container that you can use to organize your Apps. A few commonly-used examples of Environments are \"dev\" and \"production\".", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "x-f5-experimental": true, + "type": "object" + }, + "currentStatus": { + "$ref": "#/components/schemas/EnvironmentCurrentStatus" + } + } + }, + "EnvironmentCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "gatewayRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "appRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "certRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "DevPortalsList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "DevPortal": { + "type": "object", + "description": "A Dev Portal.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/DevPortalDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/DevPortalCurrentStatus" + } + }, + "additionalProperties": false + }, + "DevPortalDesiredState": { + "type": "object", + "required": [ + "ingress" + ], + "properties": { + "ingress": { + "type": "object", + "required": [ + "gatewayRefs" + ], + "properties": { + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateways that act as a Developer Portal.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "additionalProperties": false + }, + "devPortalTheme": { + "$ref": "#/components/schemas/DevPortalTheme" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devPortalType": { + "type": "string", + "enum": [ + "private", + "public", + "partner" + ] + } + }, + "additionalProperties": false + }, + "DevPortalCurrentStatus": { + "type": "object", + "properties": { + "ingress": { + "type": "object", + "required": [ + "gatewayRefs" + ], + "properties": { + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateways that act as a Developer Portal.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "devPortalTheme": { + "$ref": "#/components/schemas/DevPortalTheme" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "publishedTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "Published time is a timestamp that represents the server time when the resource was published.\nResources that have never been published do not have an `published_time` stamp.\nThe default value is language-specific and, in general, should be equivalent of the null construct.\nIn JSON format, `published_time` type is encoded as a string as described in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n" + } + } + }, + "DevPortalTheme": { + "description": "Specifies the theming for the Developer Portal.", + "type": "object", + "properties": { + "overrideDefaultTheme": { + "type": "boolean", + "example": false, + "description": "Override the default Dev Portal theme with a custom theme." + }, + "customConfig": { + "type": "object", + "properties": { + "primary": { + "$ref": "#/components/schemas/ThemeConfig" + }, + "secondary": { + "$ref": "#/components/schemas/ThemeConfig" + }, + "fonts": { + "type": "object", + "properties": { + "assignments": { + "$ref": "#/components/schemas/FontAssignments" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "brandName": { + "$ref": "#/components/schemas/BrandName" + }, + "logo": { + "$ref": "#/components/schemas/FileEncodedString" + }, + "defaultLogo": { + "$ref": "#/components/schemas/FileEncodedString" + }, + "favicon": { + "$ref": "#/components/schemas/FileEncodedString" + } + }, + "additionalProperties": false + }, + "ThemeConfig": { + "type": "object", + "properties": { + "color": { + "$ref": "#/components/schemas/ThemeConfigColors" + } + }, + "additionalProperties": false + }, + "ThemeConfigColors": { + "type": "object", + "properties": { + "primary": { + "type": "string", + "example": "#575fe6", + "description": "A CSS color string used as a primary brand theme color." + }, + "accent": { + "type": "string", + "example": "#48dbac", + "description": "A CSS color string used as an optional second brand theme color." + }, + "gray": { + "type": "string", + "example": "#1e1f27", + "description": "A CSS color string used to generate a grayscale color palette." + }, + "link": { + "type": "string", + "example": "#0f55bd", + "description": "A CSS color string used to generate anchor link colors." + }, + "fill": { + "type": "string", + "example": "#fafbfc", + "description": "A CSS color string used as the main background color." + }, + "ink": { + "type": "string", + "example": "#323441", + "description": "A CSS color string used as the main text color." + }, + "status": { + "$ref": "#/components/schemas/ThemeConfigStatusColors" + } + }, + "additionalProperties": false + }, + "ThemeConfigStatusColors": { + "type": "object", + "description": "A collection of CSS color strings used to indicate status.", + "properties": { + "info": { + "type": "string", + "example": "#20a9ea", + "description": "A CSS color string used to indicate an informational status." + }, + "success": { + "type": "string", + "example": "#37c497", + "description": "A CSS color string used to indicate a success status." + }, + "error": { + "type": "string", + "example": "#ed4f54", + "description": "A CSS color string used to indicate an error status." + }, + "warning": { + "type": "string", + "example": "#ffb900", + "description": "A CSS color string used to indicate a warning status." + } + }, + "additionalProperties": false + }, + "ThemeConfigFonts": { + "type": "object", + "description": "A collection of fonts for theming typography.", + "properties": { + "headings": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for headlines." + }, + "body": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for body copy." + }, + "cta": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for calls to action." + }, + "code": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for code and syntax highlighting." + }, + "special": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for special accent typography." + }, + "baseFontSize": { + "$ref": "#/components/schemas/BaseFontSize" + }, + "embeddedLink": { + "$ref": "#/components/schemas/EmbeddedLink" + } + }, + "additionalProperties": false + }, + "ThemeConfigFont": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": [ + "google-web-font" + ] + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false + }, + "FileEncodedString": { + "type": "string", + "example": "c29tZXRoaW5nIA==", + "description": "Base64 encoded string of a logo." + }, + "BrandName": { + "type": "string", + "example": "Acme", + "description": "Name of the brand." + }, + "BaseFontSize": { + "type": "integer", + "example": 14 + }, + "EmbeddedLink": { + "type": "string" + }, + "FontAssignments": { + "type": "object", + "$ref": "#/components/schemas/ThemeConfigFonts" + }, + "ListInstanceGroupsResponse": { + "x-f5-experimental": true, + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + } + }, + "GetInstanceGroupResponse": { + "x-f5-experimental": true, + "allOf": [ + { + "$ref": "#/components/schemas/InstanceGroup" + } + ] + }, + "InstanceGroup": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceGroupState" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceGroupStatus" + } + } + }, + "InstanceGroupState": { + "x-f5-experimental": true, + "type": "object", + "properties": { + "bigIpIntegration": { + "$ref": "#/components/schemas/BigIpIntegration" + } + } + }, + "InstanceGroupStatus": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "state" + ], + "properties": { + "instanceRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceRef" + } + }, + "bigIpIntegration": { + "$ref": "#/components/schemas/BigIpIntegration" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "InstanceRef": { + "x-f5-experimental": true, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + } + ], + "description": "Reference to a member Instance resource." + }, + "BigIpIntegration": { + "x-f5-experimental": true, + "type": "object", + "properties": { + "integrationRef": { + "description": "Reference to a BIG-IP Integration object, indicating that the Instances will be members of a BIG-IP server pool.", + "$ref": "#/components/schemas/ResourceRef" + }, + "serverPoolIp": { + "description": "The Instance IP address or CIDR to use when the Instance is a member of a BIG-IP server pool.\nIf this is a CIDR, then the Instance IP address that matches the mask will be the member address in the BIG-IP server pool.\nOtherwise, if this is an absolute IP address, that will be used as the server-pool member address.\n", + "type": "string" + } + } + }, + "IdentityProviderList": { + "type": "object", + "description": "Contains a list of Identity Provider resources.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "APIKeyIdentityProvider": { + "required": [ + "type" + ], + "type": "object", + "description": "Use an API key for authentication.\n\n> **Note:** Use of API Key authN is not recommended in production environments.\n", + "properties": { + "type": { + "type": "string", + "enum": [ + "API_KEY" + ] + } + } + }, + "JWTIdentityProvider": { + "required": [ + "jwkFile", + "type" + ], + "type": "object", + "description": "Use a JWT for authentication.", + "properties": { + "type": { + "type": "string", + "enum": [ + "JWT" + ] + }, + "jwkFile": { + "description": "Provide the path to - or URI for - a `.jwk` file to use for authentication.\nYou can also provide the `.jwk` file contents inline.\n", + "discriminator": { + "propertyName": "type", + "mapping": { + "INLINE": "#/components/schemas/JWKInline", + "REMOTE_FILE": "#/components/schemas/JWKRemoteFile" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/JWKInline" + }, + { + "$ref": "#/components/schemas/JWKRemoteFile" + } + ] + } + } + }, + "IdentityProviderDesiredState": { + "required": [ + "environmentRefs", + "identityProvider" + ], + "type": "object", + "properties": { + "environmentRefs": { + "description": "The Enviroment associated with the Identity Provider.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "identityProvider": { + "$ref": "#/components/schemas/IdentityProviderData" + } + }, + "example": { + "environmentRefs": [ + { + "ref": "/services/environments/env1" + } + ], + "identityProvider": { + "type": "JWT", + "jwkFile": { + "type": "REMOTE_FILE", + "uri": "https://example.com/keys.jwk", + "cacheExpire": "10h" + } + } + } + }, + "IdentityProviderCurrentStatus": { + "required": [ + "environmentRefs", + "identityProvider", + "state" + ], + "type": "object", + "properties": { + "environmentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "identityProvider": { + "$ref": "#/components/schemas/IdentityProviderData" + } + } + }, + "IdentityProvider": { + "required": [ + "desiredState", + "metadata" + ], + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderDesiredState" + } + } + }, + "IdentityProviderData": { + "description": "The means of authentication used by the Identity Provider (JWT or APIKey).", + "oneOf": [ + { + "$ref": "#/components/schemas/JWTIdentityProvider" + }, + { + "$ref": "#/components/schemas/APIKeyIdentityProvider" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "API_KEY": "#/components/schemas/APIKeyIdentityProvider", + "JWT": "#/components/schemas/JWTIdentityProvider" + } + } + }, + "IdentityProviderClientDesiredState": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/IdentityProviderClientCredential" + } + } + }, + "IdentityProviderClientCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "credential": { + "$ref": "#/components/schemas/IdentityProviderClientCredential" + } + } + }, + "IdentityProviderClient": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderClientCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderClientDesiredState" + } + } + }, + "IdentityProviderClientCredential": { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityProviderAPIKey" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "API_KEY": "#/components/schemas/IdentityProviderAPIKey" + } + } + }, + "IdentityProviderClientList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "UpdateIdentityProviderClient": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderClientCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderClientDesiredState" + } + } + }, + "JWK": { + "type": "object", + "properties": { + "kty": { + "type": "string", + "description": "The cryptographic algorithm family used with the key, such as \"RSA\" or \"EC\"." + }, + "use": { + "type": "string", + "description": "The intended use of the public key, whether for encrypting data or verifying the signature on data." + }, + "key_ops": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The operation(s) for which the key is intended to be used." + }, + "alg": { + "type": "string", + "description": "The algorithm intended for use with the key." + }, + "kid": { + "type": "string", + "description": "The key ID used to match a specific key." + }, + "x5u": { + "type": "string", + "description": "The X.509 URL that refers to a resource for an X.509 public key certificate or certificate chain." + }, + "x5c": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The X.509 Certificate Chain of one or more PKIX certificates. The PKIX certificate containing the key value MUST be the first certificate." + }, + "x5t": { + "type": "string", + "description": "The X.509 Certificate SHA-1 Thumbprint (a.k.a. digest) of the DER encoding of an X.509 certificate." + }, + "x5t256": { + "type": "string", + "description": "The X.509 Certificate SHA-256 Thumbprint (a.k.a. digest) of the DER encoding of an X.509 certificate." + }, + "p2s": { + "type": "string", + "description": "The salt input value for PBES2 key encryption, which is used as part of the PBKDF2 salt value." + }, + "p2c": { + "type": "string", + "description": "The PBKDF2 iteration count for PBES2 key encryption, represented as a positive JSON integer. The iteration count adds computational expense, ideally compounded by the possible range of keys introduced by the salt. A minimum iteration count of 1000 is RECOMMENDED." + }, + "crv": { + "type": "string", + "description": "The cryptographic curve used for an Elliptic Curve public key." + }, + "x": { + "type": "string", + "description": "The x coordinate of the point for an Elliptic Curve public key." + }, + "y": { + "type": "string", + "description": "The y coordinate of the point for an Elliptic Curve public key." + }, + "e": { + "type": "string", + "description": "The exponent value for an RSA public key." + }, + "exp": { + "type": "string", + "description": "The exponent value for an RSA public key." + }, + "n": { + "type": "string", + "description": "The modulus value for an RSA public key." + }, + "mod": { + "type": "string", + "description": "The modulus value for an RSA public key." + }, + "d": { + "type": "string", + "description": "The private key value for an Elliptic Curve private key OR the private exponent value for an RSA private key." + }, + "p": { + "type": "string", + "description": "The first prime factor for an RSA private key." + }, + "q": { + "type": "string", + "description": "The second prime factor for an RSA private key." + }, + "dp": { + "type": "string", + "description": "The Chinese Remainder Theorem (CRT) exponent of the first factor for an RSA private key." + }, + "dq": { + "type": "string", + "description": "The CRT exponent of the second factor for an RSA private key." + }, + "qi": { + "type": "string", + "description": "The CRT coefficient of the second factor for an RSA private key." + }, + "oth": { + "description": "An array of information about any third and subsequent primes, should they exist.", + "type": "array", + "items": { + "type": "object", + "properties": { + "r": { + "type": "string", + "description": "The prime factor." + }, + "d": { + "type": "string", + "description": "The factor CRT exponent of the corresponding prime factor." + }, + "t": { + "type": "string", + "description": "The factor CRT coefficient of the corresponding prime factor." + } + } + } + }, + "iv": { + "type": "string", + "description": "The base64url-encoded representation of the 96-bit Initialization Vector value used for the AES GCM key encryption operation." + }, + "tag": { + "type": "string", + "description": "The base64url-encoded representation of the 128-bit Authentication Tag value resulting from the AES GCM key encryption operation." + }, + "k": { + "type": "string", + "description": "The key value of the symmetric (or other single-valued) key." + }, + "enc": { + "type": "string", + "description": "The encryption algorithm for JWE." + }, + "epk": { + "type": "object", + "description": "The ephemeral public key value created by the originator for use in ECDH-ES key agreement algorithms." + }, + "apu": { + "type": "string", + "description": "The agreement PartyUInfo for ECDH-ES key agreement algorithms, containing information about the producer." + }, + "apv": { + "type": "string", + "description": "The agreement PartyVInfo for ECDH-ES key agreement algorithms." + } + } + }, + "JWKInline": { + "required": [ + "type", + "keys" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "INLINE" + ] + }, + "keys": { + "type": "array", + "description": "The JSON Web Keys.\n", + "items": { + "$ref": "#/components/schemas/JWK" + }, + "example": [ + { + "k": "ZmFudGFzdGljand0", + "kty": "oct", + "kid": 1 + } + ] + } + }, + "description": "Inline contents of a JWK JSON file.\n" + }, + "JWKRemoteFile": { + "required": [ + "uri", + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "REMOTE_FILE" + ] + }, + "uri": { + "type": "string" + }, + "cacheExpire": { + "pattern": "^[0-9]+[h|m|s]{1}$", + "type": "string", + "description": "The length of time for which to cache the remote file.\nNGINX will retrieve the file from the source URI when the cache time expires.\n", + "example": "10h" + } + } + }, + "IdentityProviderAPIKey": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "API_KEY" + ] + }, + "apiKey": { + "type": "string", + "description": "If left empty, a key will automatically be generated.\nThe apikey must contain only alphanumeric characters, underscores, and hyphens.\nThe length of the apikey must be between 8 - 256 characters.\n", + "example": "ADv-2ZheQnL_jVx5klhQ39" + } + } + }, + "CertMetadata": { + "type": "object", + "description": "Public certificate metadata.", + "required": [ + "authorityKeyIdentifier", + "commonName", + "expired", + "expiry", + "issuer", + "publicKeyType", + "serialNumber", + "signatureAlgorithm", + "subject", + "subjectAlternativeName", + "subjectKeyIdentifier", + "thumbprint", + "thumbprintAlgorithm", + "validFrom", + "validTo", + "version" + ], + "properties": { + "authorityKeyIdentifier": { + "type": "string", + "example": "2B D0 69 47 94 76 09 FE F4 6B 8D 2E 40 A6 F7 47 4D 7F 08 5E", + "description": "The identifier of the signing authority for the certificate." + }, + "commonName": { + "type": "string", + "example": "www.myapp.com", + "description": "The Common Name (CN) for the certificate. This is typically a Fully Qualified Domain Name (FQDN), and must be the same as the web address users access when connecting to a web site." + }, + "expired": { + "type": "boolean", + "example": false, + "description": "Indicates the expiration status of the certificate." + }, + "expiry": { + "type": "integer", + "example": 35500034, + "description": "The number of seconds until the certificate will expire." + }, + "issuer": { + "type": "string", + "example": "DigiCert Class 3 Extended Validation SSL SGC CA.", + "description": "Identifies the entity who signed and issued the certificate." + }, + "publicKeyType": { + "type": "string", + "example": "RSA (2048 Bits)", + "description": "Identifies the encryption algorithm used to create the public key for the ceritficate." + }, + "serialNumber": { + "type": "string", + "example": "16469416336579571270", + "description": "A unique identifier for the certificate." + }, + "signatureAlgorithm": { + "type": "string", + "example": "SHA-256", + "description": "Identifies the algorithm used to sign the certificate." + }, + "subject": { + "type": "string", + "example": "www.myapp.com", + "description": "Contains the Distinguished Name (DN) information for the certificate." + }, + "subjectAlternativeName": { + "type": "string", + "example": "DNS Name=static.xxxx", + "description": "Defines additional identifies bound to the subject of the certificate. For example, the DNS name is used to add addtional domain names to a certificate." + }, + "subjectKeyIdentifier": { + "type": "string", + "example": "31 EA 76 A9 23 74 A5 DF D4 FD EE A0 C1 A6 9E C6 11 0E 11 EC", + "description": "A hash value of the SSL certificate that can be used to identify certificates that contain a particular public key." + }, + "thumbprint": { + "type": "string", + "example": "E6 A7 87 96 E0 C7 A3 E5 43 78 35 CA 16 78 5B 48 5A A9 DD C4 5C CD 0A 65 AA 89 33 E3 C3 D0 89 71", + "description": "A hash to ensure that the certificate has not been modified." + }, + "thumbprintAlgorithm": { + "type": "string", + "example": "SHA-1", + "description": "Defines the algorithm used to hash the certificate." + }, + "validFrom": { + "type": "string", + "example": "2019-07-29T09:12:33.001Z", + "description": "The start of the validity period for the certificate." + }, + "validTo": { + "type": "string", + "example": "2029-07-29T09:12:33.001Z", + "description": "The end of the validity period for the certificate." + }, + "version": { + "type": "integer", + "example": 3, + "description": "The version of the certificate, typically 3 for X.509 certificates." + } + } + }, + "CertDesiredState": { + "type": "object", + "discriminator": { + "propertyName": "type", + "mapping": { + "PEM": "#/components/schemas/PEM", + "PKCS12": "#/components/schemas/PKCS12", + "REMOTE_FILE": "#/components/schemas/RemoteFile" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/PEM" + }, + { + "$ref": "#/components/schemas/PKCS12" + }, + { + "$ref": "#/components/schemas/RemoteFile" + } + ] + }, + "CertList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "CertStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/CertDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/CertCurrentStatus" + } + } + }, + "CertCurrentStatus": { + "type": "object", + "description": "'Shows the current status of the certificate.\n\nWhen any certificates have expired, the Certs service sets `state.selfConfigState.isConfigured` and `state.selfConfigState.isError` to `true`. The service will also add a value to the conditons array with the type \"expiration\" and a message that shows when the first certificate will expire. For example, `conditions: [{type: \"expiration\", message: \"Certificate www.example.com will expire in 29 days.\"}])`'\n", + "required": [ + "state", + "certMetadata", + "type" + ], + "properties": { + "type": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "publicCert": { + "type": "string" + }, + "data": { + "type": "string" + }, + "password": { + "type": "string" + }, + "caCerts": { + "type": "array", + "items": { + "type": "string" + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "certMetadata": { + "type": "array", + "description": "Public certificate metadata.", + "items": { + "$ref": "#/components/schemas/CertMetadata" + } + } + } + }, + "Cert": { + "type": "object", + "description": "Contains the certificate to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/CertDesiredState" + } + } + }, + "PEM": { + "type": "object", + "description": "Defines a PEM-formatted certificate that contains a key and certificates.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\nThe private key data will be redacted in the response for all get and list requests.\n", + "required": [ + "privateKey", + "publicCert", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PEM" + ] + }, + "password": { + "type": "string", + "example": "myPa$$w0rd", + "description": "The passphrase to use to decrypt the private key. Required if the private key is encrypted." + }, + "privateKey": { + "type": "string", + "example": "-----BEGIN PRIVATE KEY-----\\n MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALSQBtRafNJtTqN0\\n nYiZq6TZUsHjfG2R9PlK6jsvno9O6amN96Al6ZSTTDjhr4VU7/RJ0p/cisiCboCX\\n 4cCq6lFKpIpeZJI=\\n -----END PRIVATE KEY-----", + "description": "The private key used to sign the public certificate.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`). The private key data will be redacted in the response for all get and list requests.\n" + }, + "publicCert": { + "type": "string", + "example": "-----BEGIN CERTIFICATE-----\\n MIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\n MiJVGawyxDzBm2UhzNOE0ABHfjAgM6PAYmtMhhQawk6bmttXYhJeqhLSji4LEj5d\\n Z4FmXQ5rWM0RWBs=\\n -----END CERTIFICATE-----", + "description": "The end-entity certificate, in PEM format.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n" + }, + "caCerts": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "-----BEGIN CERTIFICATE-----\\n MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh\\n WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf\\n SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==\\n -----END CERTIFICATE-----" + ], + "description": "An optional list of intermediate certificates in PEM format that are used to validate the public certificate.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n" + } + } + }, + "PKCS12": { + "type": "object", + "description": "Defines a cert with key and certificates encoded in PKCS12 format.", + "required": [ + "data", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PKCS12" + ] + }, + "data": { + "type": "string", + "example": "MIIGoQIBAzCCBmcGCSqGSIb3DQEHAaCCBlgEggZUMIIGUDCCA08GCSqGSIb3DQEHBqCCA0AwggM8AgEAMIIDNQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIe7ZblBoEW3QCAggAgIIDCCgLEvzp9n69QbpGT0MDEwITAJBgUrDgMCGgUABBQJs6ZgeAMcxVLrq1hU+TlUOArMuQQIGK59vCBn0wECAggA", + "description": "A base-64-encoded string that contains a private key, a public certificate, and, optionally, other intermediate certificates." + }, + "password": { + "type": "string", + "example": "myPa$$w0rd", + "description": "The password to use to decrypt PKCS12 data." + } + } + }, + "RemoteFile": { + "type": "object", + "description": "Define a Cert resource by providing references to remote files.\n\n> **Note:** These are file path references only. The system can not validate the file contents or extract the certificate metadata. Providing a PEM or PKCS12 certificate is recommended.\n", + "required": [ + "privateKey", + "publicCert", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "REMOTE_FILE" + ] + }, + "privateKey": { + "type": "string", + "example": "/certs/www.example.com/example.key", + "description": "The path to the private key file." + }, + "publicCert": { + "type": "string", + "example": "/certs/www.example.com/example.crt", + "description": "The path to the certificate bundle file. The file must contain the public certificate and may contain additional intermediate certificates." + } + } + }, + "GatewayName": { + "type": "string" + }, + "GatewayList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "GZip": { + "properties": { + "isEnabled": { + "type": "boolean", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip" + } + }, + "buffers": { + "type": "object", + "properties": { + "number": { + "type": "integer" + }, + "size": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + } + }, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_buffers" + } + }, + "level": { + "type": "integer", + "minimum": 1, + "maximum": 9, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_comp_level" + } + }, + "disabledUserAgents": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_disable" + } + }, + "httpVersion": { + "type": "string", + "pattern": "^[1-3]{1}\\.[0-1]{1}$", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version" + } + }, + "minLength": { + "type": "integer", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_min_length" + } + }, + "proxied": { + "type": "string", + "enum": [ + "DISABLED", + "EXPIRED", + "NOCACHE", + "NOSTORE", + "PRIVATE", + "NOLASTMODIFIED", + "NOETAG", + "AUTH", + "ANY" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied" + } + }, + "mimeTypes": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_types" + } + }, + "vary": { + "type": "string", + "enum": [ + "DISABLED", + "ENABLED" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_vary" + } + }, + "static": { + "type": "string", + "enum": [ + "DISABLED", + "ENABLED", + "ALWAYS" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html#gzip_static" + } + } + } + }, + "Compression": { + "description": "Gzip compression settings.", + "type": "object", + "properties": { + "gzip": { + "$ref": "#/components/schemas/GZip" + } + } + }, + "GatewayWebState": { + "description": "Non-ingress settings in a Gateway that apply only to Web Components.", + "type": "object", + "properties": { + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + } + } + }, + "NginxDirective": { + "x-f5-experimental": true, + "required": [ + "directive" + ], + "properties": { + "directive": { + "type": "string", + "description": "The name of the NGINX directive. For a list of NGINX Directives, refer to [the NGINX documentation](http://nginx.org/en/docs/dirindex.html).\n" + }, + "args": { + "type": "array", + "description": "Directive arguments.", + "items": { + "type": "string" + } + }, + "block": { + "type": "array", + "description": "The directives to include within a block directive or context.", + "items": { + "$ref": "#/components/schemas/NginxDirective" + } + } + } + }, + "NginxConf": { + "x-f5-experimental": true, + "required": [ + "path", + "op", + "block" + ], + "properties": { + "path": { + "type": "string", + "description": "Path is a JSONPath expression. See [goessner.net/articles/JsonPath](https://goessner.net/articles/JsonPath/) for more information on JSONPath.\n", + "example": "$..[?(@.directive=='server')]" + }, + "op": { + "type": "string", + "description": "Indicates where to insert the block of directives in relation to the directives\nselected by the given path.\n\n* `APPEND` - Add after the selected directives\n\n* `APPEND_CHILD` - Add after the last directive in the selected directives' block\n\n* `PREPEND` - Add before the selected directives\n\n* `PREPEND_CHILD` - Add before the first directive in the selected directives' block\n", + "enum": [ + "APPEND", + "APPEND_CHILD", + "PREPEND", + "PREPEND_CHILD" + ] + }, + "block": { + "type": "array", + "description": "Block contains a list of directives that you want to add to the NGINX configuration.\n", + "items": { + "$ref": "#/components/schemas/NginxDirective" + } + } + } + }, + "NginxConfs": { + "x-f5-experimental": true, + "description": "NGINX raw configuration", + "type": "array", + "items": { + "$ref": "#/components/schemas/NginxConf" + } + }, + "HA": { + "description": "Data path high availability settings", + "type": "object", + "properties": { + "isEnabled": { + "type": "boolean", + "description": "Enables or disables HA.\n\nWhen set to `true`, supports configuring instances in an active‑passive, high‑availability (HA) setup.\n\nTo configure the gateway on HA mode:\n - `keepalived` must be installed and configured on the desired instances.\n - At least one listen IP address must be specified in the `listenIps` section within `InstanceRefs`\n\n See the `listenIps` section for additional requirements for configuring HA.\n" + } + } + }, + "GatewayStateCommon": { + "description": "Non-ingress settings in a Gateway that apply to Web and TCP/UDP Components.", + "type": "object", + "properties": { + "nginxConfs": { + "$ref": "#/components/schemas/NginxConfs" + }, + "ha": { + "$ref": "#/components/schemas/HA" + } + } + }, + "ServiceConfigState": { + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "default": "DISABLED" + }, + "GatewaySocketSettings": { + "description": "Socket settings in a Gateway.", + "type": "object", + "properties": { + "setFib": { + "x-f5-experimental": true, + "type": "integer" + }, + "fastOpen": { + "x-f5-experimental": true, + "type": "integer" + }, + "acceptFilter": { + "x-f5-experimental": true, + "type": "string", + "enum": [ + "DATA_READY", + "HTTP_READY" + ] + }, + "deferred": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "backlog": { + "x-f5-experimental": true, + "type": "integer", + "default": -1 + }, + "isIpv6Only": { + "x-f5-experimental": true, + "type": "boolean", + "default": false + }, + "reusePort": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "tcpKeepAlive": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "idle": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "interval": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "count": { + "type": "integer" + } + } + }, + "receiveBufferSize": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + }, + "sendBufferSize": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + } + } + }, + "URIMatchMethod": { + "description": "Specifies how to determine a match between an incoming Web URI and configured Web URI.", + "type": "string", + "enum": [ + "PREFIX", + "REGEX", + "REGEX_CASE_SENSITIVE", + "SUFFIX", + "EXACT" + ], + "default": "PREFIX" + }, + "TLS": { + "description": "TLS settings applicable to URIs.", + "type": "object", + "required": [ + "certRef" + ], + "properties": { + "certRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "protocols": { + "type": "array", + "items": { + "type": "string", + "pattern": "TLSv1|TLSv1\\.[1-3]|SSLv2|SSLv3" + } + }, + "cipher": { + "type": "string", + "example": "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;" + }, + "preferServerCipher": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "sessionCache": { + "type": "string", + "enum": [ + "OFF", + "NONE", + "BUILTIN", + "SHARED" + ], + "default": "OFF" + } + } + }, + "IngressUri": { + "type": "object", + "properties": { + "matchMethod": { + "$ref": "#/components/schemas/URIMatchMethod" + }, + "tls": { + "$ref": "#/components/schemas/TLS" + }, + "serverPoolPort": { + "x-f5-experimental": true, + "description": "The port number used when the IngressUri is deployed to an Instance that's a member of a BIG-IP server pool.", + "type": "integer" + } + } + }, + "IngressUris": { + "type": "object", + "description": "Defines the URI in Gateways and Components. The URI has different requirements depending on where it is used.\n\nFor Web URIs in Gateways, `uris` must be a complete URI that follows the format `://host[:port]`;\nadditionally each URI can have a match method specified and an HTTPS URI can include TLS information.\n Examples:\n - `http://www.f5.com`\n - `https://www.f5.com`\n - `http://www.f5.com:8080`\n - `http://*.info.f5.com`\n\nFor Web URIs in Components, `uris` can be either a complete URI that follows the format `://host[:port][/path]`\nor a relative path that follows the format `/path[/...]`;\nadditionally each URI can have a match method specified and an HTTPS URI can include TLS information.\n Examples:\n - `/images`\n - `/*.jpg`\n - `/locations/us/wa*`\n - `http://www.f5.com:8080/sales`\n - `http://*.f5.com:5050/testing`\n\nFor TCP/UDP URIs in Gateways and Components,`uris` must be a complete URI that follows the format `://<*|IP>:`;\nadditionally a tcp+tls URI can include TLS information. Match method is not applicable to TCP/UDP URIs.\n Examples:\n - `tcp://192.168.1.1:12345`\n - `tcp+tls://192.168.1.1:12346`\n - `tcp://192.168.1.1:12345-12350`\n - `tcp://*:12345`\n - `udp://192.168.1.1:12345`\n - `udp://*:12345`\n\nIn a TCP/UDP Component, URIs can either all have a protocol of udp or a mix of TCP and tcp+tls.\n", + "additionalProperties": { + "description": "Provide the URI associated with the resource.", + "$ref": "#/components/schemas/IngressUri" + } + }, + "InstanceGroupRef": { + "x-f5-experimental": true, + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + }, + { + "type": "object", + "properties": { + "listenIps": { + "x-f5-experimental": true, + "description": "The list of Listen IP addresses.\nSets the BIG-IP virtual address(es) on which the server listens for and accepts requests.\n", + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$", + "example": "1.1.1.1" + } + } + } + } + ] + }, + "Placement": { + "description": "Instances that have NGINX configuration applied corresponding to the Gateway and associated Components settings.", + "type": "object", + "properties": { + "instanceRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceRef" + } + }, + "instanceGroupRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroupRef" + } + } + } + }, + "GatewayIngressCommon": { + "description": "Ingress settings in a Gateway that apply to Web and TCP/UDP Components.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewaySocketSettings" + }, + { + "type": "object", + "required": [ + "uris", + "placement" + ], + "properties": { + "uris": { + "$ref": "#/components/schemas/IngressUris" + }, + "tls": { + "$ref": "#/components/schemas/TLS" + }, + "placement": { + "$ref": "#/components/schemas/Placement" + } + } + } + ] + }, + "HeaderMatchMethod": { + "type": "string", + "enum": [ + "PREFIX", + "REGEX", + "REGEX_CASE_SENSITIVE", + "SUFFIX", + "EXACT" + ], + "default": "REGEX" + }, + "IngressHeader": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "nameMatchMethod": { + "$ref": "#/components/schemas/HeaderMatchMethod" + }, + "value": { + "type": "string" + }, + "valueMatchMethod": { + "$ref": "#/components/schemas/HeaderMatchMethod" + } + } + }, + "WebIngressCommon": { + "description": "Ingress settings in a Gateway and Component that apply only to Web Components.", + "type": "object", + "properties": { + "methods": { + "description": "Specifies the HTTP method to use in requests.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "POST", + "GET", + "PUT", + "DELETE", + "PATCH", + "HEAD", + "TRACE", + "OPTIONS", + "CONNECT" + ] + } + }, + "clientMaxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.", + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$", + "deprecated": true, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + }, + "headers": { + "description": "Specifies the match method for headers to be used in requests.", + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/IngressHeader" + } + }, + "http2": { + "description": "Enable or disable HTTP/2 connections on the port. Normally, for this to work the `ssl` parameter should be specified as well,\nbut NGINX can also be configured to accept HTTP/2 connections without SSL.\nPossible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "spdy": { + "description": "Enables or disables acceptance of the SPDY connections on the specified port.\nNormally, for this to work the `ssl` parameter should be specified as well,\nbut NGINX can also be configured to accept SPDY connections without SSL. Possible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "proxyProtocol": { + "description": "Enables or disables the proxy protocol for all connections accepted on the specified port.\nThe `proxy protocol` enables NGINX and NGINX Plus to receive client connection information passed through proxy servers and load balancers,\nsuch as HAproxy and Amazon Elastic Load Balancer (ELB). The possible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "notFoundStatusCode": { + "x-f5-experimental": true, + "type": "integer", + "default": 404 + }, + "headersHashBucketSize": { + "description": "Sets the bucket size for hash tables used by the `proxy_hide_header` and `proxy_set_header` directives.", + "type": "integer", + "minimum": 1, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_bucket_size" + } + }, + "headersHashMaxSize": { + "description": "Sets the maximum size of hash tables used by the `proxy_hide_header` and `proxy_set_header` directives.", + "type": "integer", + "minimum": 1, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_max_size" + } + } + } + }, + "GatewayWebIngressClient": { + "description": "Non-buffer settings in a Gateway applicable to Web client requests.", + "type": "object", + "properties": { + "bodyInFileOnly": { + "description": "Determines whether NGINX Controller should save the entire client request body into a file.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED", + "CLEAN" + ], + "default": "DISABLED", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only" + } + }, + "bodyTimeout": { + "description": "Defines a timeout for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout" + } + }, + "headerTimeout": { + "description": "Defines a timeout for reading the client request header.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout" + } + }, + "maxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.\n\nDisables checking of client request body size when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + } + } + }, + "WebIngressBuffersCommon": { + "description": "Buffer settings common to a Gateway and Component applicable to web client requests.", + "type": "object", + "properties": { + "clientBodyBufferingIsEnabled": { + "description": "Enables or disables buffering of a client request body.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering" + } + }, + "clientBodyBufferSize": { + "description": "Sets the buffer size for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size" + } + }, + "clientBodyInSingleBuffer": { + "description": "Determines whether NGINX Controller should save the entire client request body in a single buffer.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_single_buffer" + } + } + } + }, + "GatewayWebIngress": { + "description": "Ingress settings in a Gateway that apply only to Web Components.", + "type": "object", + "properties": { + "client": { + "$ref": "#/components/schemas/GatewayWebIngressClient" + }, + "allowUnderscoresInHeaders": { + "type": "boolean", + "default": false, + "description": "Allows the use of underscores in client request header fields.\n\nWhen set to `disabled`, request headers with names that contain underscores are considered invalid and are ignored.\n" + }, + "buffers": { + "allOf": [ + { + "$ref": "#/components/schemas/WebIngressBuffersCommon" + }, + { + "type": "object", + "properties": { + "clientHeaderBufferSize": { + "description": "Sets the buffer size for reading the client request header.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_buffer_size" + } + } + } + } + ] + } + } + }, + "GatewayIngress": { + "description": "Ingress settings in a Gateway.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayIngressCommon" + }, + { + "$ref": "#/components/schemas/WebIngressCommon" + }, + { + "$ref": "#/components/schemas/GatewayWebIngress" + } + ] + }, + "GatewayDesiredState": { + "description": "The desired gateway settings that the user wants in the configuration on NGINX instances referenced by this Gateway.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayWebState" + }, + { + "$ref": "#/components/schemas/GatewayStateCommon" + }, + { + "type": "object", + "required": [ + "ingress" + ], + "properties": { + "ingress": { + "$ref": "#/components/schemas/GatewayIngress" + } + } + } + ] + }, + "ErrorSetList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorSet" + } + } + } + }, + "ErrorSet": { + "type": "object", + "description": "Defines the set of error messages to be returned for HTTP errors.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/ErrorSetDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/ErrorSetCurrentStatus" + } + } + }, + "ErrorSetDesiredState": { + "type": "object", + "properties": { + "errorCodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorCode" + } + } + } + }, + "ErrorSetCurrentStatus": { + "type": "object", + "properties": { + "errorCodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorCode" + } + } + } + }, + "ErrorCode": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "minimum": 400, + "maximum": 599, + "example": 404 + }, + "message": { + "type": "string", + "example": "{\"status\":404,\"message\":\"Resource not found\"}" + } + } + }, + "PublishedAPIList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "PublishedAPI": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/PublishedAPICurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/PublishedAPIDesiredState" + } + } + }, + "PublishedAPICurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "basePath": { + "type": "string", + "default": "/" + }, + "stripWorkloadBasePath": { + "type": "boolean", + "default": true + }, + "componentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "apiDefinitionVersionRef": { + "description": "Reference to the Version of the API Definition.\n", + "$ref": "#/components/schemas/ResourceRef" + }, + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateway associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devportalRefs": { + "type": "array", + "description": "Reference to the Dev Portal associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "PublishedAPIDesiredState": { + "type": "object", + "required": [ + "apiDefinitionVersionRef", + "gatewayRefs" + ], + "properties": { + "basePath": { + "type": "string", + "default": "/" + }, + "stripWorkloadBasePath": { + "type": "boolean", + "default": true + }, + "apiDefinitionVersionRef": { + "description": "Reference to the Version of the API Definition.\n", + "$ref": "#/components/schemas/ResourceRef" + }, + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateway associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devportalRefs": { + "type": "array", + "description": "Reference to the Dev Portal associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "ComponentList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "ComponentStateCommon": { + "type": "object", + "description": "Settings common to Web & TCP/UDP Components.", + "properties": { + "nginxConfs": { + "$ref": "#/components/schemas/NginxConfs" + } + } + }, + "ComponentIngressCommon": { + "description": "Ingress settings common to Web and TCP/UDP components.", + "type": "object", + "required": [ + "uris" + ], + "properties": { + "uris": { + "$ref": "#/components/schemas/IngressUris" + }, + "gatewayRefs": { + "description": "Reference(s) to existing Gateway resource(s).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "tls": { + "$ref": "#/components/schemas/TLS" + } + } + }, + "ComponentWebIngressClient": { + "description": "Non-buffer settings in a Component applicable to Web client requests.", + "type": "object", + "properties": { + "bodyInFileOnly": { + "description": "Determines whether NGINX Controller should save the entire client request body into a file.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED", + "CLEAN" + ], + "default": "DISABLED", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only" + } + }, + "bodyTimeout": { + "description": "Defines a timeout for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout" + } + }, + "maxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.\n\nDisables checking of client request body size when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + } + } + }, + "ComponentWebIngress": { + "description": "Ingress settings in a Web Component.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentIngressCommon" + }, + { + "$ref": "#/components/schemas/WebIngressCommon" + }, + { + "type": "object", + "properties": { + "client": { + "$ref": "#/components/schemas/ComponentWebIngressClient" + }, + "buffers": { + "$ref": "#/components/schemas/WebIngressBuffersCommon" + } + } + } + ] + }, + "MonitoringCommon": { + "description": "Monitor settings common to Web and TCP/UDP.", + "type": "object", + "properties": { + "defaultState": { + "type": "string", + "enum": [ + "HEALTHY", + "UNHEALTHY" + ], + "default": "HEALTHY" + }, + "interval": { + "type": "integer", + "minimum": 1, + "default": 5 + }, + "consecutiveSuccessThreshold": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "consecutiveFailureThreshold": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "port": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + } + }, + "MonitorResponseStatus": { + "type": "object", + "properties": { + "range": { + "type": "object", + "properties": { + "startCode": { + "type": "integer", + "minimum": 100, + "maximum": 599 + }, + "endCode": { + "type": "integer", + "minimum": 100, + "maximum": 599 + } + } + }, + "codes": { + "type": "array", + "items": { + "type": "integer", + "minimum": 100, + "maximum": 599 + } + }, + "match": { + "type": "boolean", + "default": true + } + } + }, + "MonitorResponseContent": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "match": { + "type": "boolean", + "default": true + } + } + }, + "WebMonitorResponse": { + "description": "Settings that define successful responses to a Web monitor.", + "type": "object", + "properties": { + "status": { + "$ref": "#/components/schemas/MonitorResponseStatus" + }, + "headers": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/MonitorResponseContent" + } + }, + "body": { + "$ref": "#/components/schemas/MonitorResponseContent" + } + } + }, + "WebMonitoring": { + "description": "Health monitor settings across all workload groups in a Web Component.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitoringCommon" + }, + { + "type": "object", + "properties": { + "uri": { + "description": "URI containing the relative path that the monitor probe is sent to; the host is specified in the URI in the workload group.", + "type": "string", + "default": "/" + }, + "response": { + "description": "Settings that define successful responses to a Web monitor.", + "$ref": "#/components/schemas/WebMonitorResponse" + } + } + } + ] + }, + "RoundRobinLB": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ROUND_ROBIN" + ] + } + } + }, + "IPHashLB": { + "type": "object", + "description": "IP Hash Load Balancing only applicable to Web Components.", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IPHASH" + ] + } + } + }, + "LeastConnLB": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "LEAST_CONNECTIONS" + ] + } + } + }, + "HashLBMethod": { + "type": "object", + "required": [ + "type", + "userKey" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "HASH" + ] + }, + "userKey": { + "type": "string" + }, + "consistentHash": { + "$ref": "#/components/schemas/ServiceConfigState" + } + } + }, + "LeastTimeLBMethod": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "LEAST_TIME" + ] + }, + "latencyParameter": { + "type": "string", + "description": "Values applicable to a Web Component are: [HEADER, LAST_BYTE, LAST_BYTE_INFLIGHT];\nValues applicable to a TCP/UDP Component are: [CONNECT, FIRST_BYTE, LAST_BYTE, LAST_BYTE_INFLIGHT].\nThe default value is used for a web Component; there is no default for a TCP/UDP Component.\n", + "enum": [ + "HEADER", + "CONNECT", + "FIRST_BYTE", + "LAST_BYTE", + "LAST_BYTE_INFLIGHT" + ], + "default": "HEADER" + } + } + }, + "RandomLBMethod": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "RANDOM" + ] + }, + "twoServerLBMethod": { + "type": "string", + "description": "Values applicable to a Web Component are: [LEAST_CONNECTIONS, LEAST_TIME_HEADER, LEAST_TIME_LAST_BYTE];\nValues applicable to a TCP/UDP Component are: [LEAST_CONNECTIONS, LEAST_TIME_CONNECT, LEAST_TIME_FIRST_BYTE, LEAST_TIME_LAST_BYTE].\n", + "enum": [ + "LEAST_CONNECTIONS", + "LEAST_TIME_HEADER", + "LEAST_TIME_CONNECT", + "LEAST_TIME_FIRST_BYTE", + "LEAST_TIME_LAST_BYTE" + ] + } + } + }, + "LoadBalancingMethod": { + "discriminator": { + "propertyName": "type", + "mapping": { + "ROUND_ROBIN": "#/components/schemas/RoundRobinLB", + "IPHASH": "#/components/schemas/IPHashLB", + "LEAST_CONNECTIONS": "#/components/schemas/LeastConnLB", + "HASH": "#/components/schemas/HashLBMethod", + "LEAST_TIME": "#/components/schemas/LeastTimeLBMethod", + "RANDOM": "#/components/schemas/RandomLBMethod" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/RoundRobinLB" + }, + { + "$ref": "#/components/schemas/IPHashLB" + }, + { + "$ref": "#/components/schemas/LeastConnLB" + }, + { + "$ref": "#/components/schemas/HashLBMethod" + }, + { + "$ref": "#/components/schemas/LeastTimeLBMethod" + }, + { + "$ref": "#/components/schemas/RandomLBMethod" + } + ] + }, + "DNSServiceDiscovery": { + "required": [ + "servers" + ], + "properties": { + "servers": { + "type": "array", + "description": "Array of DNS servers. Possible options are:\n- An IPv4 address with an optional port number.\n Port 53 is used if not specified.\n For example, \"10.1.1.1\", \"10.1.1.1:5353\".\n- An IPv6 address with an optional port number.\n Port 53 is used if not specified.\n For example, \"[2001::1]\", \"[2001::1]:5353\",\n- Fully qualified domain name (FQDN). ASCII characters only.\n NGINX uses the OS name server configuration\n to identify the IP addresses of the DNS servers to use.\n", + "items": { + "type": "string", + "pattern": "^(?:(?:(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(?::(?:[1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5]))?$)|(?:\\[\\s*(?:(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))|(?:(?:[0-9a-fA-F]{1,4}:){6}(?::[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-fA-F]{1,4}:){5}(?:(?:(?::[0-9a-fA-F]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-fA-F]{1,4}:){4}(?:(?:(?::[0-9a-fA-F]{1,4}){1,3})|(?:(?::[0-9a-fA-F]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){3}(?:(?:(?::[0-9a-fA-F]{1,4}){1,4})|(?:(?::[0-9a-fA-F]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){2}(?:(?:(?::[0-9a-fA-F]{1,4}){1,5})|(?:(?::[0-9a-fA-F]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){1}(?:(?:(?::[0-9a-fA-F]{1,4}){1,6})|(?:(?::[0-9a-fA-F]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-fA-F]{1,4}){1,7})|(?:(?::[0-9a-fA-F]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?](?::(?:[1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5]))?\\s*$)|(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*$))", + "minLength": 1, + "example": "10.1.1.1:5353" + }, + "minItems": 1, + "uniqueItems": true + }, + "ttl": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "description": "Overrides the TTL setting present in the DNS record.", + "example": "10s" + }, + "timeout": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "description": "Sets the timeout for domain name resolution.", + "example": "10s" + } + } + }, + "WorkloadGroupCommon": { + "description": "Settings common to Web and TCP/UDP workloadGroups.", + "type": "object", + "properties": { + "locationRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "loadBalancingMethod": { + "$ref": "#/components/schemas/LoadBalancingMethod" + }, + "dnsServiceDiscovery": { + "$ref": "#/components/schemas/DNSServiceDiscovery" + } + } + }, + "WebProxy": { + "description": "Proxy retry and timeout settings applicable to servers in a Web workloadGroup associated with a Component.", + "type": "object", + "properties": { + "nextUpstream": { + "description": "Specifies in which cases a request should be passed to the next server.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "ERROR", + "TIMEOUT", + "INVALID_HEADER", + "HTTP_500", + "HTTP_502", + "HTTP_503", + "HTTP_504", + "HTTP_403", + "HTTP_404", + "HTTP_429", + "NON_IDEMPOTENT", + "OFF" + ] + } + }, + "connectTimeout": { + "description": "Defines a timeout for establishing a connection with a proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + }, + "sendTimeout": { + "description": "Sets a timeout for transmitting a request to the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + } + } + }, + "SessionPersistenceCookie": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "COOKIE" + ] + }, + "srvID": { + "type": "string" + }, + "expireTime": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "domain": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "SessionPersistenceRoute": { + "type": "object", + "required": [ + "type", + "routeInfoLocation" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ROUTE" + ] + }, + "routeInfoLocation": { + "type": "string", + "enum": [ + "COOKIE", + "URI", + "BOTH" + ] + } + } + }, + "SessionPersistenceCookieLearn": { + "type": "object", + "required": [ + "type", + "create", + "lookup" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "COOKIE_LEARN" + ] + }, + "create": { + "type": "string", + "pattern": "^\\$.+" + }, + "lookup": { + "type": "string", + "pattern": "^\\$.+" + } + } + }, + "SessionPersistence": { + "description": "SessionPersistence settings in a Web workloadGroup.", + "discriminator": { + "propertyName": "type", + "mapping": { + "COOKIE": "#/components/schemas/SessionPersistenceCookie", + "ROUTE": "#/components/schemas/SessionPersistenceRoute", + "COOKIE_LEARN": "#/components/schemas/SessionPersistenceCookieLearn" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SessionPersistenceCookie" + }, + { + "$ref": "#/components/schemas/SessionPersistenceRoute" + }, + { + "$ref": "#/components/schemas/SessionPersistenceCookieLearn" + } + ] + }, + "WorkloadUri": { + "type": "object", + "properties": { + "weight": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "maxConns": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "maxFails": { + "type": "integer", + "minimum": 0, + "default": 1 + }, + "failTimeout": { + "x-f5-experimental": true, + "type": "string", + "default": "10s", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "isBackup": { + "type": "boolean", + "default": false + }, + "isDown": { + "type": "boolean", + "default": false + }, + "route": { + "x-f5-experimental": true, + "type": "string" + }, + "srvService": { + "type": "string" + }, + "slowStart": { + "x-f5-experimental": true, + "type": "integer", + "minimum": 0, + "default": 0 + }, + "isDrain": { + "type": "boolean", + "default": false + } + } + }, + "WebWorkloadGroup": { + "description": "Group of servers hosting a part of a Web application represented by a Component.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkloadGroupCommon" + }, + { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/components/schemas/WebProxy" + }, + "sessionPersistence": { + "$ref": "#/components/schemas/SessionPersistence" + }, + "uris": { + "type": "object", + "description": "The URI for a server hosting a part of a Web application.\n\nIt must conform to the format `schema://address[:port]`\nwhere schema is chosen from http or https, address is IP or hostname,\nschema and address must be provided.\n\nFor example:\n\n- `http://192.0.2.247`\n- `https://192.0.2.247:8443`\n- `https://www.f5workload.com`\n", + "additionalProperties": { + "$ref": "#/components/schemas/WorkloadUri" + } + } + } + } + ] + }, + "BackendBuffers": { + "description": "Proxy buffer settings applicable to servers across all Web workloadGroups associated with a Component.", + "type": "object", + "properties": { + "headerSize": { + "description": "Sets the size of the buffer used for reading the first part of the response received from the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size" + } + }, + "isEnabled": { + "description": "Enables or disables buffering of responses from the proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering" + } + }, + "size": { + "description": "Sets the number and size of the buffers used for reading a response from the proxied server, for a single connection.", + "type": "object", + "properties": { + "number": { + "type": "integer" + }, + "size": { + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$" + } + }, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers" + } + }, + "busySize": { + "description": "When buffering of responses from the proxied server is enabled, it limits the total size of buffers that can be busy sending a response to the client while the response is not yet fully read.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_busy_buffers_size" + } + }, + "ignoreClientAbort": { + "description": "Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort" + } + }, + "forceRanges": { + "description": "Enables byte-range support for both cached and uncached responses from the proxied server regardless of the \"Accept-Ranges\" field in these responses.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_force_ranges" + } + }, + "httpVersion": { + "description": "Sets the HTTP protocol version for proxying.", + "type": "string", + "enum": [ + "1.0", + "1.1" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version" + } + }, + "rate": { + "description": "Limits the speed (in bytes per second) of reading the response from the proxied server.\n\nDisables rate limiting when set to 0. \n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_limit_rate" + } + }, + "readTimeout": { + "description": "Defines a timeout for reading a response from the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout" + } + }, + "maxTempFileSize": { + "description": "Sets the maximum size of the temporary file that the response can be saved into. Note that the buffering of responses from proxied server is enabled and the response does not fit into the buffers.\n\nDisables temporary file usage when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size" + } + }, + "tempFileWriteSize": { + "description": "Limits the size of data written to a temporary file at a time, when buffering of responses from the proxied server to temporary files is enabled.\n\nDisables temporary file usage when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_file_write_size" + } + } + } + }, + "WebBackend": { + "description": "Backend settings in a Web Component.\n", + "type": "object", + "properties": { + "keepAlive": { + "type": "object", + "properties": { + "connections": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "requestsPerConn": { + "type": "integer" + }, + "idleTimeout": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "example": "1h" + } + } + }, + "monitoring": { + "$ref": "#/components/schemas/WebMonitoring" + }, + "workloadGroups": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/WebWorkloadGroup" + } + }, + "preserveHostHeader": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "queue": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "length" + ], + "properties": { + "length": { + "type": "integer" + }, + "timeOut": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "example": "1h" + } + } + }, + "httpVersion": { + "x-f5-experimental": true, + "type": "string", + "pattern": "^[1-3]{1}\\.[0-1]{1}$", + "example": 1 + }, + "ntlmAuthentication": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "persistentState": { + "x-f5-experimental": true, + "type": "string" + }, + "buffers": { + "$ref": "#/components/schemas/BackendBuffers" + }, + "isSocketKeepaliveEnabled": { + "description": "Configures the “TCP keepalive” behavior for outgoing connections to a proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_socket_keepalive" + } + }, + "ignoreHeaders": { + "description": "Disables processing of certain response header fields from the proxied server.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "X-Accel-Redirect", + "X-Accel-Expires", + "X-Accel-Limit-Rate", + "X-Accel-Buffering", + "X-Accel-Charset", + "Expires", + "Cache-Control", + "Set-Cookie", + "Vary" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers" + } + }, + "debugHeaders": { + "description": "Permits passing otherwise disabled header fields from a proxied server to a client.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "X-Accel-Redirect", + "X-Accel-Expires", + "X-Accel-Limit-Rate", + "X-Accel-Buffering", + "X-Accel-Charset", + "Expires", + "Cache-Control", + "Set-Cookie", + "Vary" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_header" + } + }, + "tls": { + "description": "TLS settings applicable to servers in Web workloadGroups.", + "type": "object", + "properties": { + "cipher": { + "description": "Specifies the enabled ciphers for requests to a proxied HTTPS server.", + "type": "string", + "example": "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_ciphers" + } + }, + "name": { + "description": "Allows overriding the server name used to verify the certificate of the proxied HTTPS server.", + "type": "string", + "example": "$proxy_host", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_name" + } + }, + "protocols": { + "description": "Enables the specified protocols for requests to a proxied HTTPS server.", + "type": "array", + "items": { + "type": "string", + "pattern": "TLSv1|TLSv1\\.[1-3]|SSLv2|SSLv3" + }, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_protocols" + } + }, + "isServerNameEnabled": { + "description": "Enables or disables passing of the server name through TLS Server Name Indication extension (SNI, RFC 6066) when establishing a connection with the proxied HTTPS server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name" + } + }, + "isSessionReuseEnabled": { + "description": "Determines whether SSL sessions can be reused when working with the proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_session_reuse" + } + }, + "isVerifiedEnabled": { + "description": "Enables or disables verification of the proxied HTTPS server certificate.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify" + } + }, + "verifyDepth": { + "description": "Sets the verification depth in the proxied HTTPS server certificates chain.", + "type": "integer", + "minimum": 0, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify_depth" + } + } + } + } + } + }, + "ApplicableUri": { + "type": "object", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string" + }, + "matchMethod": { + "$ref": "#/components/schemas/URIMatchMethod" + } + } + }, + "ApplicableUris": { + "type": "array", + "description": "Defines an array of ingress URIs with a corresponding matchMethod that this rewrite rule applies to.\nBy default, a rewrite rule applies to all of the ingress URIs in the component.\nA rewrite rule can also be applied at a gateway level by specifying ingress URIs\nfrom the gateway. For example \"http://www.nginx.com\". Note that applying the rewrite\nrule to URIs at a gateway level can affect other components. The URI and the matchMethod must\nmatch an ingress URI defined either at the component or gateway level. If no match is found\nthe request is rejected.\n", + "items": { + "$ref": "#/components/schemas/ApplicableUri" + } + }, + "UriRewrite": { + "type": "object", + "required": [ + "incomingPattern", + "rewritePattern" + ], + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + }, + "incomingPattern": { + "type": "string", + "description": "The regex pattern to match against the request URIs that are expected to be rewritten." + }, + "rewritePattern": { + "type": "string", + "description": "The replacement regex pattern to apply to the URIs that are to be rewritten.", + "minLength": 1 + }, + "afterExecute": { + "type": "string", + "enum": [ + "NONE", + "LAST", + "BREAK", + "REDIRECT", + "PERMANENT" + ], + "default": "BREAK" + } + } + }, + "UriRedirect": { + "type": "object", + "required": [ + "responseCode" + ], + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + }, + "responseCode": { + "type": "integer", + "minimum": 300, + "maximum": 308 + }, + "url": { + "type": "string", + "minLength": 1, + "description": "The return url to use for responses in the 301-308 range." + }, + "text": { + "type": "string", + "description": "The return text to send for 300 responses." + } + } + }, + "ProgrammabilityAction": { + "type": "string", + "enum": [ + "ADD", + "MODIFY", + "DELETE" + ] + }, + "CookieModification": { + "type": "object", + "required": [ + "action", + "cookieName" + ], + "properties": { + "action": { + "$ref": "#/components/schemas/ProgrammabilityAction" + }, + "cookieName": { + "type": "string" + }, + "cookieValue": { + "type": "string" + } + } + }, + "ProgrammabilityAddRequestHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds request header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the request header.", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ProgrammabilityDeleteRequestHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes request header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the request header to modify.", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "RequestHeaderModification": { + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/ProgrammabilityAddRequestHeader", + "DELETE": "#/components/schemas/ProgrammabilityDeleteRequestHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ProgrammabilityAddRequestHeader" + }, + { + "$ref": "#/components/schemas/ProgrammabilityDeleteRequestHeader" + } + ] + }, + "ProgrammabilityAddResponseHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds response header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the response header.", + "minLength": 1 + }, + "responseCodeFilter": { + "type": "string", + "description": "The value to apply to the response code filter.", + "enum": [ + "ALWAYS", + "PRE_DEFINED" + ], + "default": "PRE_DEFINED" + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ProgrammabilityDeleteResponseHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes response header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.\n\n> Warning: `Date`, `Content-Length`, and `Connection` headers cannot be deleted.\n", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ResponseHeaderModification": { + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/ProgrammabilityAddResponseHeader", + "DELETE": "#/components/schemas/ProgrammabilityDeleteResponseHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ProgrammabilityAddResponseHeader" + }, + { + "$ref": "#/components/schemas/ProgrammabilityDeleteResponseHeader" + } + ] + }, + "Programmability": { + "type": "object", + "properties": { + "uriRewrites": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UriRewrite" + } + }, + "httpHttpsRedirect": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "uriRedirects": { + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/UriRedirect" + } + }, + "cookieModifications": { + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/CookieModification" + } + }, + "requestHeaderModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RequestHeaderModification" + } + }, + "responseHeaderModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResponseHeaderModification" + } + } + } + }, + "Logging": { + "description": "Settings for error logs and access logs.", + "type": "object", + "properties": { + "errorLog": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "accessLog": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "format": { + "type": "string" + } + } + } + } + }, + "WAF": { + "description": "Defines the desired configurations for the WAF associated with the application component.", + "properties": { + "isEnabled": { + "type": "boolean", + "default": true, + "description": "Indicates whether the WAF is enabled or not." + }, + "isMonitorOnly": { + "type": "boolean", + "default": true, + "description": "Indicates whether the WAF will monitor or block security violations." + }, + "signatureOverrides": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "IGNORE" + ] + } + }, + "description": "Identifies overrides for the signatures contained within the associated security strategy.\n", + "example": { + "1234": { + "action": "IGNORE" + }, + "1235": { + "action": "IGNORE" + } + } + } + } + } + }, + "APIKeyClientAuth": { + "description": "Defines how an API client should provide their API Key credentials.", + "required": [ + "keyLocation" + ], + "properties": { + "keyLocation": { + "type": "string", + "enum": [ + "HEADER", + "QUERY_PARAM" + ] + }, + "key": { + "type": "string" + } + } + }, + "JWTClientAuth": { + "description": "Defines how an API Client should provide their JWT.", + "required": [ + "keyLocation" + ], + "properties": { + "keyLocation": { + "type": "string", + "enum": [ + "BEARER", + "HEADER", + "QUERY_PARAM", + "COOKIE" + ] + }, + "key": { + "type": "string" + } + } + }, + "ConditionalAuthPolicy": { + "description": "Defines further fine-grained access control on top of API Key or JWT Auth.", + "required": [ + "sourceType", + "comparisonType", + "comparisonValues", + "action", + "denyStatusCode" + ], + "properties": { + "sourceType": { + "type": "string", + "enum": [ + "HEADER", + "JWT_CLAIM" + ] + }, + "sourceKey": { + "type": "string" + }, + "comparisonType": { + "type": "string", + "enum": [ + "EQUALS", + "NOT_EQUALS", + "IN", + "CONTAINS" + ] + }, + "comparisonValues": { + "type": "array", + "description": "Valid values for the sourceType.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + } + }, + "action": { + "type": "string", + "enum": [ + "ALLOW", + "DENY" + ] + }, + "denyStatusCode": { + "type": "integer" + } + } + }, + "RateLimit": { + "required": [ + "rate" + ], + "properties": { + "rate": { + "type": "string", + "pattern": "^[0-9]+r\\/[m|s]{1}$", + "description": "Sets the maximum number of allowed requests.\n\nYou can specify the rate limit as requests per second (r/s) or requests per minute (r/m).\n", + "example": "10r/s" + }, + "burstBeforeReject": { + "type": "integer", + "minimum": 0 + }, + "burstBeforeDelay": { + "type": "integer", + "minimum": 0 + }, + "statusCode": { + "type": "integer", + "default": 429 + }, + "key": { + "type": "string", + "default": "$binary_remote_addr", + "description": "Parameters (NGINX variable) for a shared memory zone that stores states for various keys; used for `limit_req_zone`." + } + } + }, + "Security": { + "type": "object", + "description": "Defines the desired security configurations for the application component.", + "properties": { + "strategyRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "waf": { + "$ref": "#/components/schemas/WAF" + }, + "identityProviderRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + }, + "description": "The list of Identity Providers that are used in this Security policy." + }, + "apiKeyClientAuth": { + "$ref": "#/components/schemas/APIKeyClientAuth" + }, + "jwtClientAuth": { + "$ref": "#/components/schemas/JWTClientAuth" + }, + "conditionalAuthPolicies": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ConditionalAuthPolicy" + } + }, + "rateLimits": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/RateLimit" + } + }, + "interceptWorkloadErrors": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + } + } + }, + "PublishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "ComponentWebDesiredState": { + "description": "The desired settings in the Web Component that the user wants in the configuration on NGINX instances associated with\nthe Gateways which this component references.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "required": [ + "ingress", + "backend" + ], + "properties": { + "componentType": { + "description": "Defines the Component type. The default type is Web.", + "type": "string", + "enum": [ + "WEB" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentWebIngress" + }, + "backend": { + "$ref": "#/components/schemas/WebBackend" + }, + "programmability": { + "$ref": "#/components/schemas/Programmability" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "security": { + "$ref": "#/components/schemas/Security" + }, + "publishedApiRefs": { + "$ref": "#/components/schemas/PublishedApiRefs" + }, + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + } + } + } + ] + }, + "ComponentTcpUdpIngress": { + "description": "Ingress settings in a TCP/UDP Component.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentIngressCommon" + } + ] + }, + "TcpUdpMonitoring": { + "description": "Health monitor settings across all workload groups in a TCP/UDP Component.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitoringCommon" + }, + { + "type": "object", + "properties": { + "send": { + "description": "Probe request for a TCP/UDP monitor.", + "type": "string" + }, + "response": { + "description": "Case-sensitive regular expression for the expected success response to a TCP/UDP monitor.", + "type": "string" + } + } + } + ] + }, + "TcpUdpProxy": { + "description": "Proxy retry and timeout settings applicable to servers in a TcpUdp workloadGroup associated with a Component.", + "type": "object", + "properties": { + "nextUpstream": { + "description": "When a connection to the proxied server cannot be established, determines whether a client connection will be passed to the next server.", + "type": "string", + "enum": [ + "ON", + "OFF" + ], + "default": "OFF" + }, + "connectTimeout": { + "description": "Defines a timeout for establishing a connection with the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + }, + "proxyTimeout": { + "description": "Sets the timeout between two successive read or write operations on client or proxied server connections.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + } + } + }, + "TcpUdpWorkloadGroup": { + "description": "Group of servers hosting a part of a TCP/UDP application represented by a Component.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkloadGroupCommon" + }, + { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/components/schemas/TcpUdpProxy" + }, + "uris": { + "type": "object", + "description": "The URI for a server hosting a part of a TCP/UDP application.\n\nThe URI must conform to the format `schema://address:port`\nwhere schema is chosen from tcp, udp, or tcp+tls, address is IP or hostname.\nAll three of schema, address, and port must be provided.\n\nFor example:\n\n- `tcp://192.0.2.247:8443`\n- `tcp+tls://192.0.2.247:8449`\n- `udp://www.f5workload.com:989`\n", + "additionalProperties": { + "$ref": "#/components/schemas/WorkloadUri" + } + } + } + } + ] + }, + "TcpUdpBackend": { + "description": "Backend settings in a TCP/UDP Component.\n", + "type": "object", + "properties": { + "monitoring": { + "$ref": "#/components/schemas/TcpUdpMonitoring" + }, + "workloadGroups": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TcpUdpWorkloadGroup" + } + } + } + }, + "ComponentTcpUdpDesiredState": { + "description": "The desired settings in the TCP/UDP Component to use in the configuration on NGINX instances associated with the Gateways that this Component references.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "required": [ + "componentType", + "ingress", + "backend" + ], + "properties": { + "componentType": { + "description": "Defines what type of Component this is. The type must be TCPUDP.", + "type": "string", + "enum": [ + "TCPUDP" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentTcpUdpIngress" + }, + "backend": { + "$ref": "#/components/schemas/TcpUdpBackend" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + } + } + } + ] + }, + "ComponentDesiredState": { + "description": "The desired component settings to use in the NGINX instance configuration that's associated with\nthe Gateways that this component references.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/ComponentWebDesiredState" + }, + { + "$ref": "#/components/schemas/ComponentTcpUdpDesiredState" + } + ] + }, + "ComponentWebCurrentStatus": { + "description": "The current snapshot of the web component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "properties": { + "componentType": { + "description": "Defines what type of Component this is.", + "type": "string", + "enum": [ + "WEB" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentWebIngress" + }, + "backend": { + "$ref": "#/components/schemas/WebBackend" + }, + "programmability": { + "$ref": "#/components/schemas/Programmability" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "security": { + "$ref": "#/components/schemas/Security" + }, + "publishedApiRefs": { + "$ref": "#/components/schemas/PublishedApiRefs" + }, + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "ComponentTcpUdpCurrentStatus": { + "description": "The current snapshot of the TCP/UDP component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "properties": { + "componentType": { + "description": "Defines what type of Component this is.", + "type": "string", + "enum": [ + "TCPUDP" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentTcpUdpIngress" + }, + "backend": { + "$ref": "#/components/schemas/TcpUdpBackend" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "ComponentCurrentStatus": { + "description": "The current snapshot of the component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this Component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/ComponentWebCurrentStatus" + }, + { + "$ref": "#/components/schemas/ComponentTcpUdpCurrentStatus" + } + ] + }, + "Component": { + "description": "A component represents the processing –- reverse proxying, rate limiting, security policy enforcement, header rewrites, etc.\n–- of traffic associated with a logical part (for example, microservice) of an application/API. It also defines the subsequent\nload balancing of traffic to workloads implementing that part of the application/API.\n\nA component can be either a web or a TCP/UDP component –- indicated by the component type. Web components are used to\nconfigure NGINX functionality associated with HTTP/HTTPS protocols and inherit web and common settings from linked Gateways.\nTCP/UDP components are used to configure NGINX functionality associated with TCP/UDP protocols\nand inherit TCP/UDP and common settings from linked Gateways.\n", + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/ComponentDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/ComponentCurrentStatus" + } + } + }, + "ComponentName": { + "type": "string" + }, + "Location": { + "required": [ + "metadata", + "desiredState" + ], + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/LocationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/LocationState" + } + } + }, + "GetLocationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Location" + } + ] + }, + "ListLocationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Location" + } + } + } + }, + "LocationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherLocation" + }, + { + "$ref": "#/components/schemas/AWSLocation" + }, + { + "$ref": "#/components/schemas/AzureLocation" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_LOCATION": "#/components/schemas/OtherLocation", + "AWS_LOCATION": "#/components/schemas/AWSLocation", + "AZURE_LOCATION": "#/components/schemas/AzureLocation" + } + } + }, + "AWSLocation": { + "type": "object", + "required": [ + "vpcID", + "region", + "integrationRef", + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type. Select the environment where you want to create the location. \nTo create a location that’s specific to the AWS cloud environment, select AWS_LOCATION.\n", + "enum": [ + "AWS_LOCATION" + ] + }, + "region": { + "description": "The AWS region.\n", + "type": "string" + }, + "vpcID": { + "type": "string", + "description": "The vpcID of the AWS Virtual Private Cloud (VPC) where new Instances created under this location should reside.\nThe VPC must be in the specified AWS region.\n" + }, + "integrationRef": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "AzureLocation": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "type", + "region", + "resourceGroup", + "subscriptionID", + "integrationRef" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type.", + "enum": [ + "AZURE_LOCATION" + ] + }, + "region": { + "description": "The Azure region.", + "type": "string" + }, + "resourceGroup": { + "type": "string", + "description": "The name of the resourceGroup." + }, + "subscriptionID": { + "type": "string", + "description": "The unique alphanumeric string that identifies the Azure subscription." + }, + "integrationRef": { + "description": "Integration ref.", + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "OtherLocation": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type. Select the environment where you want to create the location. \nTo create a location that’s not specific to any cloud environment, select OTHER_LOCATION.\n", + "enum": [ + "OTHER_LOCATION" + ] + } + } + }, + "InstanceTemplate": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceTemplateState" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceTemplateState" + } + } + }, + "GetInstanceTemplateResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/InstanceTemplate" + } + ] + }, + "ListInstanceTemplateResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceTemplate" + } + } + } + }, + "InstanceTemplateState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSInstanceTemplate" + }, + { + "$ref": "#/components/schemas/AzureInstanceTemplate" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_INSTANCE_TEMPLATE": "#/components/schemas/AWSInstanceTemplate", + "AZURE_INSTANCE_TEMPLATE": "#/components/schemas/AzureInstanceTemplate" + } + } + }, + "AWSInstanceTemplate": { + "type": "object", + "required": [ + "type", + "amiID", + "instanceType", + "subnetID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "AWS_INSTANCE_TEMPLATE" + ] + }, + "amiID": { + "type": "string", + "description": "The AWS `amiID` for the image to use when deploying an Instance using the template.\n" + }, + "instanceType": { + "type": "string", + "description": "The machine size.\n" + }, + "subnetID": { + "type": "string", + "description": "The `subnetID` of the AWS subnet where new Instances created using the Instance Template should reside.\n\nThe specified subnet must be in the same AWS Virtual Private Cloud (VPC) as the Instance Template's parent Location resource.\n" + }, + "securityGroupIDs": { + "type": "array", + "description": "The list of AWS securityGroupIDs that you want to apply to new Instances. \n\nThe Security GroupIDs must be available in the same AWS region and Virtual Private Cloud (VPC) as the Instance Template's parent Location resource.\n", + "items": { + "type": "string" + } + }, + "publicKey": { + "type": "string", + "description": "Provide the public key that you want to use to authenticate to the EC2 instance that this template will create. \n" + }, + "associatePublicIPAddress": { + "type": "boolean", + "description": "Specify if a public IP address should be assigned to the instance.\n" + } + } + }, + "AzureInstanceTemplate": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "type", + "instanceType", + "image", + "networkInterface", + "adminUser", + "publicKey" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "AZURE_INSTANCE_TEMPLATE" + ] + }, + "image": { + "$ref": "#/components/schemas/AzureImage" + }, + "instanceType": { + "type": "string", + "description": "The virtual machine size and type." + }, + "networkInterface": { + "$ref": "#/components/schemas/AzureNetworkInterface" + }, + "adminUser": { + "type": "string", + "description": "The name of the administration account." + }, + "publicKey": { + "type": "string", + "description": "The Public Key string for the adminUser." + } + } + }, + "AzureImage": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureImageID" + }, + { + "$ref": "#/components/schemas/AzureImageReference" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AZURE_IMAGE_ID": "#/components/schemas/AzureImageID", + "AZURE_IMAGE_REFERENCE": "#/components/schemas/AzureImageReference" + } + } + }, + "AzureImageID": { + "type": "object", + "description": "The Azure resource ID for the image to use when deploying an Instance.", + "required": [ + "type", + "imageID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Image.", + "enum": [ + "AZURE_IMAGE_ID" + ] + }, + "imageID": { + "type": "string", + "description": "The resource ID of the Azure image." + } + } + }, + "AzureImageReference": { + "type": "object", + "description": "The parameters that identify which Azure Marketplace image to use for the Instance.", + "required": [ + "type", + "publisher", + "offer", + "sku" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Image.", + "enum": [ + "AZURE_IMAGE_REFERENCE" + ] + }, + "publisher": { + "type": "string", + "description": "The publisher of the Azure Marketplace image." + }, + "offer": { + "type": "string", + "description": "The offer of the Azure Marketplace image." + }, + "sku": { + "type": "string", + "description": "The SKU of the Azure Marketplace image." + }, + "version": { + "type": "string", + "description": "The version of the Azure Marketplace image (default is latest)." + } + } + }, + "AzureNetworkID": { + "type": "object", + "description": "Identifies the existing Azure Network Interface that you want the Instance to use.", + "required": [ + "type", + "nicID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Network Interface.", + "enum": [ + "AZURE_NIC_ID" + ] + }, + "nicID": { + "type": "string", + "description": "The ID of the Azure Network Interface." + } + } + }, + "AppList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "App": { + "type": "object", + "description": "An App is a collection of Components.", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "x-f5-experimental": true, + "type": "object" + }, + "currentStatus": { + "$ref": "#/components/schemas/AppCurrentStatus" + } + } + }, + "AppCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "componentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "Integration": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/IntegrationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/IntegrationState" + } + }, + "example": { + "metadata": { + "name": "my-aws-integration", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY_CREDENTIAL", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY_CREDENTIAL", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "GetIntegrationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Integration" + } + ] + }, + "ListIntegrationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "IntegrationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSIntegration" + } + ], + "discriminator": { + "propertyName": "type" + } + }, + "AWSIntegration": { + "required": [ + "type", + "credential" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AWS_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string" + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSAccessKeyCredential" + } + ], + "discriminator": { + "propertyName": "type" + } + } + } + }, + "AWSAccessKeyCredential": { + "required": [ + "type", + "accessKeyID", + "secretAccessKey" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AWS_ACCESS_KEY_CREDENTIAL" + ] + }, + "accessKeyID": { + "type": "string" + }, + "secretAccessKey": { + "type": "string" + } + } + }, + "PolicyDesiredState": { + "type": "object", + "description": "The defired state of the policy", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/PolicyData", + "example": "{\"policy\": {\"name\": \"/Common/NAPBlockingDefaultPolicy\", \"template\": {\"name\": \"POLICY_TEMPLATE_NGINX_BASE\"}, \"applicationLanguage\": \"utf-8\", \"enforcementMode\": \"blocking\", \"signatures\": [], \"bot-defense\": {\"settings\": {\"isEnabled\": false}}, \"headers\": [{\"name\": \"*\", \"type\": \"wildcard\", \"decodeValueAsBase64\": \"disabled\"}, {\"name\": \"*-bin\", \"type\": \"wildcard\", \"decodeValueAsBase64\": \"required\"},{\"name\": \"Referer\", \"type\": \"explicit\", \"decodeValueAsBase64\": \"disabled\"}, {\"name\": \"Authorization\", \"type\": \"explicit\", \"decodeValueAsBase64\": \"disabled\"}, {\"name\": \"Transfer-Encoding\", \"type\": \"explicit\", \"decodeValueAsBase64\": \"disabled\"}], \"cookies\": [{\"name\": \"*\", \"type\": \"wildcard\", \"decodeValueAsBase64\": \"disabled\"}], \"parameters\": [{\"name\": \"*\", \"type\": \"wildcard\", \"decodeValueAsBase64\": \"disabled\"}]}}" + } + } + }, + "PolicyList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "PolicyStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/PolicyDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/PolicyCurrentStatus" + } + } + }, + "PolicyCurrentStatus": { + "type": "object", + "description": "Shows the current status of the policy.", + "required": [ + "state", + "data" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/PolicyData" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "Policy": { + "type": "object", + "description": "Contains the policy to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/PolicyDesiredState" + } + } + }, + "PolicyData": { + "type": "object", + "description": "Contains the policy to upload." + }, + "Gateway": { + "type": "object", + "description": "A Gateway represents the initial network entry point of application and/or API traffic into an NGINX instance that is\nin the data path of this traffic. Gateway settings are combined with Component settings that reference the Gateway;\nthe resulting composite config is sent to the NGINX instances that the Gateway references.\n\nA Gateway can be referenced by either web components and/or TCP/UDP components. Web-only settings in the Gateway (for example, web URIs)\napply only to web components. TCP/UDP-only settings in the Gateway (for example, TCP/UDP URIs) apply only to TCP/UDP components.\nWeb and TCP/UDP common settings in the Gateway (for example, global TLS, socket) apply to both web and TCP/UDP components.\n\nExamples:\nGateway with web and TCP/UDP URIs, web-specific settings, common settings. Web URIs and web settings apply to web components.\nCommon settings apply to both component types. TCP/UDP URIs apply only to TCP/UDP components –- presently, there are no other TCP/UDP only settings.\n\nGateway web URIs (for example, https://www.xyz.com) combined with web component URIs (for example, /blog) define web URI config (https://www.xyz.com/blog).\nComponent TCP/UDP URIs define TCP/UDP URI config (for example, tcp+tls://192.168.1.1:200); Gateway TCP/UDP URIs can provide TLS info plus restrict\nwhich TCP/UDP URIs can be in the component. Alternatively, component URIs fully define the URI config if the Gateway has no URIs.\n\nIf only a single URI type is in the Gateway, the URI config for that type is determined by combining the Gateway URIs with\nthe URIs from components of that type; only component URIs are used for the URI config for the other type.\n\nFor HTTPS URIs, global Gateway TLS settings are used when more specific TLS info is not present in the Gateway URIs,\nor for component URIs that have an HTTPS protocol and hostnames with no specific URI or component global TLS settings defined.\n\nFor tcp+tls URIs, Gateway TLS settings are used when TLS info is not defined in a component URI or component global TLS.\nA Gateway URI’s TLS info is used if it encompasses the component URI. For example, tcp+tls://192.168.1.5:100-104 in the Gateway and\ncomponent URI of tcp+tls://192.168.1.5:100. Global Gateway TLS is used if no other TLS settings apply.\n", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/GatewayDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/GatewayCurrentStatus" + } + } + }, + "GatewayCurrentStatus": { + "description": "The current snapshot of the gateway settings that are reflected in the configuration on NGINX instances referenced by this Gateway.\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayWebState" + }, + { + "$ref": "#/components/schemas/GatewayStateCommon" + }, + { + "type": "object", + "properties": { + "ingress": { + "$ref": "#/components/schemas/GatewayIngress" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + } + }, + "responses": { + "BadRequest": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Unauthorized": { + "description": "User authentication is invalid or missing.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotFound": { + "description": "The specified instance group resource was not found.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Conflict": { + "description": "The request failed due to a conflict with an existing instance group resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotAllowed": { + "description": "The request is not allowed on the specified resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 120322, + "message": "Error deleting the location: the name 'unspecified' is reserved. Specify a different name for the location, then try again." + } + } + } + } + }, + "examples": { + "AWSInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "tags": [ + "prod-1", + "dev-1" + ] + }, + "desiredState": { + "type": "AWS_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/aws-east/instance-templates/small-dev-template" + } + } + } + }, + "AzureInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "tags": [ + "prod-1", + "dev-1" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/small-dev-template" + } + } + } + }, + "InstanceUpdateRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "description": "An example NGINX Instance.", + "tags": [ + "prod-1", + "dev-1" + ] + } + } + }, + "AWSInstance": { + "value": { + "metadata": { + "name": "instance-1", + "displayName": "My Instance", + "tags": [ + "prod-1", + "dev-1" + ], + "links": { + "rel": "/infrastructure/locations/unspecified/instances/instance-1" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T09:12:33.001Z" + }, + "desiredState": { + "type": "AWS_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/aws-uswest-2/instance-templates/my-t2-medium" + } + }, + "currentStatus": { + "type": "AWS_INSTANCE", + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "hostname": "instance-1.mycloud.net", + "version": "1.17.3", + "muted": false, + "networkConfig": { + "networkInterfaces": [ + { + "name": "eth0", + "privateDnsName": "ip-172-16-0-71.us-west-2.compute.internal", + "publicDnsName": "ec2-54-212-110-173.us-west-2.compute.amazonaws.com", + "privateIP": "172.16.0.71", + "publicIP": "54.212.110.173", + "subnet": { + "subnetID": "subnet-055d28be58feb0a7d", + "cidrIPv4": "172.16.0.0/24" + } + } + ] + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": 2.8 + }, + "legacyNginxMetadata": { + "build": "nginx-plus-r19", + "built_from_source": false, + "last_seen": "2019-11-12T23:47:52.966Z", + "pid": 2749, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "19-1~bionic" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": null, + "user": "nginx", + "with-cc-opt": "-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.17.3/debian/debuild-base/nginx-plus-1.17.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ] + }, + "start_time": 1573580604000 + }, + "legacySystemMetadata": { + "boot": 1573580280000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "network": { + "default": "lo", + "interfaces": { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + } + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": 1, + "cpus": 4, + "hypervisor": "VMware", + "mhz": 2300, + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": 18.04 + } + } + } + } + }, + "AzureInstance": { + "value": { + "metadata": { + "name": "instance-1", + "createTime": "2020-10-27T22:14:36.994172Z", + "description": "My Azure Instance", + "displayName": "Instance-1", + "tags": [ + "prod-1", + "dev-1" + ], + "kind": "instance", + "links": { + "rel": "/api/v1/infrastructure/locations/azure-westus2/instances/instance-1" + }, + "ref": "/infrastructure/locations/azure-westus2/instances/instance-1", + "uid": "4ed722ec-1bc0-47a1-9772-87718fa9ddb8", + "updateTime": "2020-10-27T22:14:36.994172Z" + }, + "desiredState": { + "nginx": { + "process": { + "group": "test", + "user": "testuser" + } + }, + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/azure-standard-ds1v2" + }, + "type": "AZURE_INSTANCE" + }, + "currentStatus": { + "networkConfig": { + "networkInterfaces": [ + { + "name": "my-nic-1", + "publicDnsName": "myapp.westus2.cloudapp.azure.com", + "privateIP": "10.0.1.4", + "publicIP": "52.229.16.198", + "subnet": { + "subnetID": "subnet-test", + "cidrIPv4": "10.0.1.0/24" + } + } + ] + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": "3.12.5" + }, + "hostname": "instance-1", + "instanceID": "ce266e67-42ec-41a0-b8f4-f4cd0be01828", + "legacyNginxMetadata": { + "build": "nginx-plus-r22", + "built_from_source": true, + "id": 6, + "last_seen": "2020-10-27T22:30:34.376659Z", + "pid": 1138, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "nginx-plus-r22" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": "", + "user": "nginx", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + " 11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + " 11 Sep 2018" + ] + }, + "start_time": 1603836993, + "version": "1.19.0" + }, + "legacySystemMetadata": { + "boot": 1603836911000, + "disk_partitions": [ + { + "device": "/dev/sda1", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda15", + "fstype": "vfat", + "mountpoint": "/boot/efi" + }, + { + "device": "/dev/sdb1", + "fstype": "ext4", + "mountpoint": "/mnt" + } + ], + "id": 5, + "network": { + "default": "eth0", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "10.0.1.4", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "ipv6": { + "address": "fe80::20d:3aff:fec5:3f80", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:0d:3a:c5:3f:80", + "name": "eth0" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "36608K" + }, + "cores": "1", + "cpus": "1", + "hypervisor": "Microsoft", + "mhz": "2095.191", + "model": "Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.5 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "nginx": { + "process": { + "group": "test", + "user": "testuser" + } + }, + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/azure-standard-ds1v2" + }, + "type": "AZURE_INSTANCE", + "version": "1.19.0" + } + } + }, + "OtherInstance": { + "value": { + "metadata": { + "name": "test_instance_1", + "displayName": "Test Instance 1", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified/instances/test_instance_1" + }, + "createTime": "2020-05-20T20:02:18.107875Z", + "updateTime": "2020-05-20T20:02:18.107875Z" + }, + "desiredState": { + "type": "OTHER_INSTANCE" + }, + "currentStatus": { + "type": "OTHER_INSTANCE", + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "status": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": "999.0.0-1" + }, + "hostname": "test-fab4edf8-data-1.test", + "legacyNginxMetadata": { + "build": "nginx-plus-r21", + "built_from_source": false, + "id": 2, + "last_seen": "2020-05-20T20:40:21.146894Z", + "pid": 2995, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "21-1~bionic" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": null, + "user": "nginx", + "with-cc-opt": "'-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.17.9/debian/debuild-base/nginx-plus-1.17.9=. -fstack-protector-strong -Wformat -Werror=format-security,-D_FORTIFY_SOURCE=2 -fPIC'", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ] + }, + "start_time": 1590004864000 + }, + "legacySystemMetadata": { + "boot": 1590004492000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "id": 1, + "network": { + "default": "lo", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "192.0.10.1", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "mac": "02:42:98:fb:40:48", + "name": "docker0" + }, + { + "ipv4": { + "address": "10.149.41.181", + "netmask": "255.255.240.0", + "prefixlen": 20 + }, + "ipv6": { + "address": "fe80::250:56ff:fe98:e2f1", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:50:56:98:e2:f1", + "name": "ens32" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": "1", + "cpus": "4", + "hypervisor": "VMware", + "mhz": "2300.000", + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "version": "1.17.9" + } + } + }, + "ListInstanceResponse": { + "value": { + "items": [ + { + "currentStatus": { + "agent": { + "version": "3.7.44" + }, + "hostname": "i-563457274582", + "legacyNginxMetadata": { + "build": "nginx-plus-r22", + "built_from_source": false, + "id": 2, + "last_seen": "2020-07-08T17:24:07.869745Z", + "pid": 3104, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": {}, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": "", + "user": "nginx", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "", + "11", + "Sep", + "2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "", + "11", + "Sep", + "2018" + ] + }, + "start_time": 0 + }, + "legacySystemMetadata": { + "boot": 1594225800000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "id": 1, + "network": { + "default": "", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "10.149.41.97", + "netmask": "255.255.240.0", + "prefixlen": 20 + }, + "ipv6": { + "address": "fe80::250:56ff:fe98:b512", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:50:56:98:b5:12", + "name": "ens32" + }, + { + "ipv4": { + "address": "192.0.10.1", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "mac": "02:42:24:f1:ae:8a", + "name": "docker0" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": "1", + "cpus": "4", + "hypervisor": "VMware", + "mhz": "2300.000", + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "status": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "type": "OTHER_INSTANCE", + "version": "1.19.0" + }, + "desiredState": { + "type": "OTHER_INSTANCE" + }, + "metadata": { + "createTime": "2020-07-08T16:42:07.97301Z", + "displayName": "Test Instance 1", + "kind": "instance", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified/instances/instance-1" + }, + "name": "instance-1", + "ref": "/infrastructure/locations/unspecified/instances/instance-1", + "uid": "ec8d8dac-10b6-4195-943b-1a5d65dd131c", + "updateTime": "2020-07-08T16:42:07.97301Z" + } + } + ] + } + }, + "InstanceGroupRequest": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + }, + "GetInstanceGroupResponse": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + }, + "ListInstanceGroupsResponse": { + "value": { + "items": [ + { + "currentStatus": { + "instanceRefs": [], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "us-west-2 autoscale group", + "displayName": "aws-autoscale-group", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/amz-us-west-2-as-group" + }, + "name": "amz-us-west-2-as-group", + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + }, + "IdentityProviderRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "environmentRefs": [ + { + "ref": "/services/environments/dev" + } + ], + "identityProvider": { + "type": "API_KEY" + } + } + } + }, + "IdentityProviderClientListRequest": { + "value": { + "items": [ + { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + ] + } + }, + "IdentityProviderClientRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + }, + "IdentityProviderClientPatchMetadataRequest": { + "value": { + "metadata": { + "name": "resource-name", + "description": "This is a sample description string. It provides information about the resource." + } + } + }, + "IdentityProviderClientPatchDesiredStateRequest": { + "value": { + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + }, + "ComponentRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "ingress": { + "uris": { + "/api/golf/": { + "matchMethod": "PREFIX" + } + }, + "gatewayRefs": [ + { + "ref": "/services/environments/dev/gateways/sportsgw" + } + ] + }, + "publishedApiRefs": [ + { + "ref": "/services/environments/dev/apps/sports/published-apis/golf-pub" + } + ], + "backend": { + "workloadGroups": { + "serverGrp1": { + "uris": { + "{{httpWorkloadInstance1}}": {} + } + } + }, + "monitoring": {} + }, + "security": { + "rateLimit": { + "defaultLimit": { + "rate": 1, + "rateMeasure": "SECONDS" + } + } + } + } + } + }, + "OtherLocationRequest": { + "value": { + "metadata": { + "name": "my-other-location", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "OTHER_LOCATION" + } + } + }, + "AWSLocationRequest": { + "value": { + "metadata": { + "name": "my-aws-location", + "description": "AWS Location for us-east-1", + "displayName": "us-east-1-location", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AWS_LOCATION", + "vpcID": "vpc-1234", + "region": "us-east-1", + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + } + } + } + }, + "AzureLocationRequest": { + "value": { + "metadata": { + "name": "my-azure-location", + "description": "Azure Location for West US 2", + "displayName": "westus2-location", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_LOCATION", + "resourceGroup": "myResourceGroup", + "subscriptionID": "mySubscriptionID", + "region": "westus2", + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + } + } + } + }, + "OtherLocationResponse": { + "value": { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + }, + "AWSLocationResponse": { + "value": { + "currentStatus": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + }, + "region": "us-east-1", + "type": "AWS_LOCATION", + "vpcID": "vpc-1234" + }, + "desiredState": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + }, + "region": "us-east-1", + "type": "AWS_LOCATION", + "vpcID": "vpc-1234" + }, + "metadata": { + "createTime": "2020-05-13T16:57:02.931198Z", + "description": "AWS Location for us-east-1", + "displayName": "us-east-1-location", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-aws-location" + }, + "name": "my-aws-location", + "tags": [ + "dev", + "prod" + ], + "uid": "62f72025-59a1-4c11-8cca-798b5e12efb8", + "updateTime": "2020-05-13T16:57:02.931198Z" + } + } + }, + "AzureLocationResponse": { + "value": { + "currentStatus": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + }, + "type": "AZURE_LOCATION", + "subscriptionID": "mySubscriptionID", + "region": "westus2" + }, + "desiredState": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + }, + "type": "AZURE_LOCATION", + "subscriptionID": "mySubscriptionID", + "region": "westus2" + }, + "metadata": { + "createTime": "2020-05-13T16:57:02.931198Z", + "description": "Azure Location for West US 2", + "displayName": "westus2-location", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-azure-location" + }, + "name": "my-azure-location", + "tags": [ + "dev", + "prod" + ], + "uid": "62f72025-59a1-4c11-8cca-798b5e12efb8", + "updateTime": "2020-05-13T16:57:02.931198Z" + } + } + }, + "ListLocationResponse": { + "value": { + "items": [ + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "Location for instances where location has not been specified", + "displayName": "Unspecified (default)", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified" + }, + "name": "unspecified", + "tags": [ + "default" + ], + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + }, + "AWSRequest": { + "value": { + "metadata": { + "name": "my-instance-template", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AWS_INSTANCE_TEMPLATE", + "amiID": "ami-a0cfeed8", + "instanceType": "t2.large", + "subnetID": "subnet-12345678", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "publicKey": "my-public-key", + "associatePublicIPAddress": true + } + } + }, + "AzureRequestWithMarketplaceImageAndUsingExistingNic": { + "value": { + "metadata": { + "name": "my-azure-template-for-standard-A1", + "description": "Azure Instance Template for Standard A1", + "displayName": "Standard_A1-instance-template", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + } + } + }, + "AzureRequestWithCustomImageAndCreatingNewNicAndPublicIP": { + "value": { + "metadata": { + "name": "my-azure-template-for-standard-DS1_v2", + "description": "Azure Instance Template for Standard DS1v2", + "displayName": "DS1_v2-instance-template", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_ID", + "imageID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myCustomImageID" + }, + "instanceType": "Standard_DS1_v2", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_CONFIG", + "virtualNetwork": "my-virtual-network", + "subnet": "my-subnet", + "securityGroup": "my-network-sg", + "publicIp": true + } + } + } + }, + "AWSResponse": { + "value": { + "currentStatus": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "desiredState": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/location-1/instance-templates/my-instance-template" + }, + "name": "my-instance-template", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + }, + "AzureResponse": { + "value": { + "currentStatus": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "Azure Instance Template for Standard A1", + "displayName": "Standard_A1-instance-template", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/azure-westus2/instance-templates/my-azure-template-for-standard-A1" + }, + "name": "my-azure-template-for-standard-A1", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + }, + "AWSListResponse": { + "value": { + "items": [ + { + "currentStatus": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "desiredState": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/location-1/instance-templates/my-instance-template" + }, + "name": "my-instance-template", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + ] + } + } + } + } +} diff --git a/static/controller/api/ctlr-platform-openapi.json b/static/controller/api/ctlr-platform-openapi.json new file mode 100644 index 000000000..01c7d6bb7 --- /dev/null +++ b/static/controller/api/ctlr-platform-openapi.json @@ -0,0 +1,7437 @@ +{ + "openapi": "3.0.3", + "info":{ + "title": "NGINX Controller Platform REST API", + "version": "v1", + "description": "Manage the NGINX Controller platform." + }, + "tags": [ + + { + "name": "Authentication Providers", + "description": "Use the Authentication Providers API to create, update, or remove authentication providers." + }, + { + "name": "Login Providers", + "description": "Use the Login Providers API to retrieve a list of the available authentication providers." + }, + { + "name": "Login", + "description": "Use the Login API to retrieve an authentication cookie. Include the session ID that's in the authentication cookie in the request header for all subsequent requests." + }, + { + "name": "Reset Password", + "description": "Use the Reset Password API to manage NGINX Controller password recovery." + }, + { + "name": "Verify Authorization", + "description": "Verifies the current session is authorized to access a list of resources." + }, + { + "name": "Nodes", + "description": "Use the Nodes API to manage NGINX Controller control plane nodes." + }, + { + "name": "Global Settings", + "description": "Use the Global Settings API to manage the system-wide configurations for NGINX Controller and Controller Agent." + }, + { + "name": "Global Features", + "description": "Use the Features API to manage NGINX Controller features." + }, + { + "name": "License", + "description": "Use the License API to manage the license(s) for NGINX Controller." + }, + { + "name": "Integrations", + "description": "Use the Integrations API to manage integrated cloud provider or data collector accounts." + }, + { + "name": "Users", + "description": "Use the Users API to manage NGINX Controller User accounts." + }, + { + "name": "Roles", + "description": "Use the Roles API to manage NGINX Controller User Roles." + }, + { + "name": "Groups", + "description": "Use the Groups API to manage NGINX Controller authentication groups." + } + ], + "servers": [ + { + "description": "NGINX Controller API", + "url": "https://{{CONTROLLER_FQDN}}/api/v1" + }], + "paths": { + "/platform/auth/password-recovery": { + "post": { + "tags": [ + "Password" + ], + "summary": "Request password reset", + "description": "Creates a password recovery code for user with given email and sends an email with reset link. The reset link is valid for an hour.", + "operationId": "requestResetPassword", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetPasswordRequest" + }, + "example": { + "metadata": { + "name": "user@example.com" + } + } + } + } + }, + "responses": { + "204": { + "description": "Successfully created the password recovery code. No content was returned." + } + } + } + }, + "/platform/auth/password-recovery/{code}": { + "put": { + "tags": [ + "Password" + ], + "summary": "Password reset", + "description": "Check if the new password satisfies the policy constraints and update the password for the user associated with the recovery code.", + "operationId": "resetPassword", + "parameters": [ + { + "$ref": "#/components/parameters/code" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetPassword" + }, + "example": { + "desiredState": { + "password": "********" + }, + "metadata": { + "name": "user@example.com" + } + } + } + } + }, + "responses": { + "204": { + "description": "Successfully updated the password for the user. No content was returned." + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/auth/providers": { + "post": { + "tags": [ + "Authentication Providers" + ], + "summary": "Create an Authentication Provider", + "description": "Creates a new authentication provider.\n", + "operationId": "configureAuthProvider", + "requestBody": { + "description": "Contains the configuration for a supported authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldaps://dc1.mydomain.com", + "sslMode": "VERIFY_CA", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "get": { + "tags": [ + "Authentication Providers" + ], + "summary": "List all Authentication Providers", + "description": "Returns a list of all authentication providers.\n", + "operationId": "listAuthProviders", + "responses": { + "200": { + "description": "Successfully returned a list of authentication providers.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListAuthProviders" + }, + "example": { + "items": [ + { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/auth/providers/{providerName}": { + "get": { + "tags": [ + "Authentication Providers" + ], + "summary": "Get an Authentication Provider", + "description": "Returns information about the specified authentication provider.", + "parameters": [ + { + "name": "providerName", + "in": "path", + "description": "The name of the authentication provider.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "operationId": "getProvider", + "responses": { + "200": { + "description": "Successfully returned the requested authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "patch": { + "tags": [ + "Authentication Providers" + ], + "summary": "Update an Authentication Provider", + "description": "Updates the configuration for an existing authentication provider.\n\n> **Note:** You can use PATCH to update one or more specific configurations. Any settings not specified in the request will not be changed.\n", + "parameters": [ + { + "name": "providerName", + "in": "path", + "description": "The name of the authentication provider.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Contains the desired configuration changes for an authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@example.com", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "operationId": "partialUpdateProvider", + "responses": { + "200": { + "description": "Successfully updated the configuration for the authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Authentication Providers" + ], + "summary": "Update an Authentication Provider", + "description": "Updates all of the configurations for an existing authentication provider.\n", + "parameters": [ + { + "name": "providerName", + "in": "path", + "description": "The name of the authentication provider.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Contains the desired configuration for the authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "", + "password": "" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "operationId": "updateProvider", + "responses": { + "200": { + "description": "Successfully updated the configuration for the authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "201": { + "description": "Successfully created the configuration for the provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "********" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "*******" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "********" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "*******" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "Authentication Providers" + ], + "summary": "Delete an Authentication Provider", + "description": "Deletes the authentication provider.", + "parameters": [ + { + "name": "providerName", + "in": "path", + "description": "The name of the authentication provider.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "operationId": "disable", + "responses": { + "204": { + "description": "Successfully deleted the authentication provider." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/auth/verify": { + "x-f5-experimental": true, + "post": { + "x-f5-experimental": true, + "tags": [ + "Verify Auth Permissions" + ], + "summary": "Request a collection of permitted actions", + "description": "Returns a list of authorized actions based on a list of requested actions and resources.\n", + "operationId": "doVerify", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VerifyList" + }, + "example": { + "items": [ + { + "path": "/services/environments/test1", + "method": "DELETE" + }, + { + "path": "/services/environments/test2", + "method": "PUT" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successfully retrieved a list of authorized actions.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VerifyList" + }, + "example": { + "items": [ + { + "path": "/services/environments/test1", + "method": "DELETE", + "permitted": false + }, + { + "path": "/services/environments/test2", + "method": "PUT", + "permitted": true + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/global": { + "get": { + "tags": [ + "Global Settings" + ], + "summary": "Get the Global Settings", + "operationId": "getGlobalSettings", + "description": "Gets information about the global settings for NGINX Controller.", + "responses": { + "200": { + "description": "Successfully retrieved the global settings for NGINX Controller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Global Settings" + ], + "operationId": "putGlobalSettings", + "description": "Updates the global settings used by NGINX Controller.", + "summary": "Update the Global Settings", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the global settings for NGINX Controller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "patch": { + "tags": [ + "Global Settings" + ], + "operationId": "patchGlobalSettings", + "description": "Updates the global settings for NGINX Controller.", + "summary": "Update part of the Global Settings", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the global settings for NGINX Controller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/global/features": { + "x-f5-experimental": true, + "get": { + "x-f5-experimental": true, + "tags": [ + "Global Features" + ], + "summary": "Get the Global Features", + "operationId": "getGlobalFeatures", + "description": "Gets information about the global features for NGINX Controller.", + "responses": { + "200": { + "description": "Successfully retrieved the global features for NGINX Controller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalFeatures" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/license": { + "get": { + "tags": [ + "License" + ], + "summary": "Get a License", + "description": "Gets information for the active NGINX Controller license.", + "operationId": "getLicense", + "responses": { + "200": { + "description": "Successfully retrieved the active Controller license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseResponse" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "******", + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + }, + "currentStatus": { + "subscription": { + "id": "b6d7c577-b708-44ad-839c-9743f85fcf7c" + }, + "entitlement": { + "features": [ + { + "name": "NGINX Controller Load Balancing", + "limit": 20, + "unitOfMeasure": "WORKLOADS", + "type": "PAID", + "id": "ADC", + "expiry": "1996-02-26T00:00:00.000Z", + "gracePeriodDays": 30 + } + ] + }, + "state": { + "currentInstance": { + "id": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "type": "NGINX Controller", + "status": "INVALID", + "version": "3.3.0", + "telemetryLastReported": "2021-05-10T00:00:00Z", + "features": [ + { + "name": "NGINX Controller Load Balancing", + "used": 5, + "aggregateUsed": 10, + "remaining": 5, + "unitOfMeasure": "WORKLOADS", + "id": "ADC", + "daysUntilExpiry": 20, + "gracePeriodRemainingDays": 30 + } + ], + "configState": { + "selfConfigState": { + "isConfigured": true, + "isConfiguring": false, + "isError": false, + "isDeleting": false + }, + "conditions": [] + } + } + }, + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "License" + ], + "summary": "Upload a License", + "description": "Uploads an NGINX Controller license.\n\nProvide your NGINX Controller license in the JSON request body as a base64-encoded string or as an unencoded customer association token.\n", + "operationId": "putLicense", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PutLicenseRequest" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully uploaded the license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseResponse" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "******", + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + }, + "currentStatus": { + "subscription": { + "id": "b6d7c577-b708-44ad-839c-9743f85fcf7c" + }, + "entitlement": { + "features": [ + { + "name": "NGINX Controller Load Balancing", + "limit": 20, + "unitOfMeasure": "WORKLOADS", + "type": "PAID", + "id": "ADC", + "expiry": "2021-02-26T00:00:00.000Z", + "gracePeriodDays": 30 + } + ] + }, + "state": { + "currentInstance": { + "id": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "type": "NGINX Controller", + "status": "INVALID", + "version": "3.3.0", + "telemetryLastReported": "2021-05-10T00:00:00Z", + "features": [ + { + "name": "NGINX Controller Load Balancing", + "used": 5, + "aggregateUsed": 10, + "remaining": 5, + "unitOfMeasure": "WORKLOADS", + "id": "ADC", + "daysUntilExpiry": 20, + "gracePeriodRemainingDays": 0 + } + ], + "configState": { + "selfConfigState": { + "isConfigured": true, + "isConfiguring": false, + "isError": false, + "isDeleting": false + }, + "conditions": [] + } + } + }, + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + } + } + } + } + }, + "202": { + "description": "The request to upload a license succeeded. The License resource will be created when the upload is complete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseResponse" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "******", + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + }, + "currentStatus": { + "subscription": { + "id": "b6d7c577-b708-44ad-839c-9743f85fcf7c" + }, + "entitlement": { + "features": [ + { + "name": "NGINX Controller Load Balancing", + "limit": 20, + "unitOfMeasure": "WORKLOADS", + "type": "PAID", + "id": "ADC", + "expiry": "2021-02-26T00:00:00.000Z", + "gracePeriodDays": 30 + } + ] + }, + "state": { + "currentInstance": { + "id": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "type": "NGINX Controller", + "status": "INVALID", + "version": "3.3.0", + "telemetryLastReported": "2021-05-10T00:00:00Z", + "features": [ + { + "name": "NGINX Controller Load Balancing", + "used": 5, + "aggregateUsed": 10, + "remaining": 5, + "unitOfMeasure": "WORKLOADS", + "id": "ADC", + "daysUntilExpiry": 20, + "gracePeriodRemainingDays": 0 + } + ], + "configState": { + "selfConfigState": { + "isConfigured": false, + "isConfiguring": true, + "isError": false, + "isDeleting": false + }, + "conditions": [] + } + } + }, + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "License" + ], + "operationId": "deleteLicense", + "summary": "Delete a License", + "description": "Deletes an NGINX Controller License resource.", + "responses": { + "202": { + "description": "Successfully scheduled the request to delete the license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseResponse" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "******", + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + }, + "currentStatus": { + "subscription": { + "id": "b6d7c577-b708-44ad-839c-9743f85fcf7c" + }, + "entitlement": { + "features": [ + { + "name": "NGINX Controller Load Balancing", + "limit": 20, + "unitOfMeasure": "WORKLOADS", + "type": "PAID", + "id": "ADC", + "expiry": "2021-02-26T00:00:00.000Z", + "gracePeriodDays": 30 + } + ] + }, + "state": { + "currentInstance": { + "id": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "type": "NGINX Controller", + "status": "INVALID", + "version": "3.3.0", + "telemetryLastReported": "2021-05-10T00:00:00Z", + "features": [ + { + "name": "NGINX Controller Load Balancing", + "used": 5, + "aggregateUsed": 10, + "remaining": 5, + "unitOfMeasure": "WORKLOADS", + "id": "ADC", + "daysUntilExpiry": 20, + "gracePeriodRemainingDays": 0 + } + ], + "configState": { + "selfConfigState": { + "isConfigured": false, + "isConfiguring": false, + "isError": false, + "isDeleting": true + }, + "conditions": [] + } + } + }, + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/licenses/nginx-plus-licenses": { + "get": { + "tags": [ + "License" + ], + "summary": "List all NGINX+ Licenses.", + "description": "Returns a list of all NGINX Plus licenses.", + "operationId": "listNginxPlusLicenses", + "responses": { + "200": { + "description": "Successfully retrieved the list of NGINX Plus licenses.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NginxPlusLicensesList" + }, + "example": { + "items": [ + { + "metadata": { + "name": "controller-provided", + "ref": "/platform/licenses/nginx-plus-licenses/controller-provided", + "kind": "license" + }, + "currenStatus": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + }, + "desiredState": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "402": { + "$ref": "#/components/responses/PaymentRequired" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/licenses/nginx-plus-licenses/{licenseName}": { + "get": { + "tags": [ + "License" + ], + "summary": "Get the NGINX Plus certificate and key bundle by name", + "description": "Gets the NGINX Plus certificate and key as a JSON or gzip file.", + "operationId": "getNginxPlusLicense", + "parameters": [ + { + "in": "header", + "name": "Content-Type", + "schema": { + "type": "string", + "example": "application/json" + } + }, + { + "name": "licenseName", + "description": "The name of the license.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/LicenseName" + } + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the specified NGINX Plus license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NginxPlusLicenseResponse" + }, + "example": { + "metadata": { + "name": "controller-provided", + "ref": "/platform/licenses/nginx-plus-licenses/controller-provided", + "kind": "license" + }, + "currenStatus": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + }, + "desiredState": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + } + } + }, + "application/gzip": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "402": { + "$ref": "#/components/responses/PaymentRequired" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/FileNotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/license-file": { + "post": { + "deprecated": true, + "tags": [ + "License" + ], + "summary": "Upload a License", + "description": "Uploads an NGINX Controller license.\n\nAccepts a single file (encoded as Base64) that may contain one or more product licenses.\n", + "operationId": "uploadLicense", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully uploaded a license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/License" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 20, + "product": "NGINX Controller API Management", + "serial": 20145, + "type": "PRODUCTION", + "version": 1, + "id": "APIM" + } + ] + }, + "currentStatus": { + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 20, + "product": "NGINX Controller API Management", + "serial": 20145, + "type": "PRODUCTION", + "version": 1, + "id": "APIM" + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/login": { + "post": { + "tags": [ + "Login" + ], + "summary": "Log in to NGINX Controller", + "description": "Logs in to the NGINX Controller platform and returns the user account's authentication cookie.\n\nThe session ID is returned in an authentication cookie named `session`. You must include this session ID in the request header for all subsequent requests to authenticate to the platform. For example:\n\n`curl -X GET --cookie 'session=' --header 'Content-type: application/json' 'https://192.0.2.10/api/v1/platform/global'`\n\n- The maximum session lifetime is 8 hours. Sessions are purged within 5 minutes of expiring. Once the session lifetime limit is exceeded, you must log in to obtain a fresh session token.\n- Sessions are purged immediately on logout.\n- Sessions are purged immediately if the user is removed.\n", + "operationId": "login", + "requestBody": { + "description": "A JSON object containing the type and the authentication information itself.\n- If type == 'BASIC', then the username and password are required.\n- If type == 'ACTIVE_DIRECTORY', then the authentication provider name, username, and password are required.\n- If type == 'AZURE_ACTIVE_DIRECTORY', then the authentication provider name, and type are required.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Login" + } + } + } + }, + "security": [], + "responses": { + "200": { + "description": "Received request to login with OIDC. Returns the Azure's authorization URL for SSO.\n" + }, + "204": { + "description": "Successfully authenticated.\nThe session ID is returned in an authentication cookie named `session`. You must include this session ID in the request header for all subsequent requests.\n", + "headers": { + "Set-Cookie": { + "schema": { + "type": "string", + "example": "session=.eJwlzjEOwzAIQNG7MGcA22DIZSKbgNI1aaaqd2-kLn96w; HttpOnly; Secure; Path=/" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "409": { + "$ref": "#/components/responses/StatusConflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + }, + "503": { + "$ref": "#/components/responses/ServiceUnavailable" + } + } + }, + "get": { + "tags": [ + "Login" + ], + "summary": "Get Login Session", + "description": "Checks the validity of the current user's session. Returns the user's account info if the session is valid.", + "operationId": "sessionsStatus", + "responses": { + "200": { + "description": "Successfully validated the session ID and returned the associated user account info.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "currentStatus": { + "account": "1", + "authn": "amplify", + "email": "nobody@nodomain.com", + "firstName": "nobody", + "id": 777, + "lastLogin": 1580759750, + "lastName": "here", + "password": "********", + "roles": [ + { + "links": { + "rel": "/api/v1/platform/roles/guest", + "name": "guest" + }, + "ref": "/platform/roles/guest" + } + ], + "groups": [ + { + "links": { + "rel": "/api/v1/platform/auth/groups/guest", + "name": "guest" + }, + "ref": "/platform/groups/guest" + } + ] + }, + "desiredState": { + "email": "nobody@nodomain.com", + "firstName": "nobody", + "lastName": "here", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/guest" + } + ] + }, + "metadata": { + "createTime": "2020-02-03T19:15:24.916809Z", + "kind": "user", + "name": "nobody@nodomain.com", + "updateTime": "2020-02-03T19:55:50.291147Z" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/Internal" + }, + "503": { + "$ref": "#/components/responses/ServiceUnavailable" + } + } + } + }, + "/platform/oidc-handler": { + "get": { + "tags": [ + "OIDC Handler" + ], + "summary": "OIDC redirect URL, that handles Login into controller using OIDC", + "description": "The endpoint that OIDC provider talks to after authenticating the user. It returns the user account's authentication cookie.\n\nThe session ID is returned in an authentication cookie named `session`. You must include this session ID in the request header for all subsequent requests to authenticate to the platform. For example:\n\n`curl -X GET --cookie 'session=' --header 'Content-type: application/json' 'https://192.0.2.10/api/v1/platform/global'`\n\n- The maximum session lifetime is 8 hours.\n- Sessions are purged immediately on logout.\n- Sessions are purged immediately if the user is removed or associated Auth provider is removed.\n Read more about this here https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#successful-response\n", + "operationId": "oidc-handler", + "parameters": [ + { + "in": "query", + "name": "code", + "schema": { + "type": "string" + }, + "description": "The authorization_code that the app requested. The app exchnages teh code to get access token." + }, + { + "in": "query", + "name": "state", + "schema": { + "type": "string" + }, + "description": "State parameter is included if the app added it in the login request to the Identity provider. This helps prevent CSRF attacks." + }, + { + "in": "query", + "name": "error", + "schema": { + "type": "string" + }, + "description": "An error code string sent from the Identity provider when authentication did not go through as expected." + }, + { + "in": "query", + "name": "error_description", + "schema": { + "type": "string" + }, + "description": "A specific error message that describes the root cause of the authentication failure." + } + ], + "security": [], + "responses": { + "302": { + "description": "Successfully authenticated and Sends Redirect back to the home page.\nThe session ID is returned in an authentication cookie named `session`. You must include this session ID in the request header for all subsequent requests.\n", + "headers": { + "Set-Cookie": { + "schema": { + "type": "string", + "example": "session=.eJwlzjEOwzAIQNG7MGcA22DIZSKbgNI1aaaqd2-kLn96w; HttpOnly; Secure; Path=/" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "503": { + "$ref": "#/components/responses/ServiceUnavailable" + } + } + } + }, + "/platform/logout": { + "post": { + "tags": [ + "Logout" + ], + "summary": "Log out of NGINX Controller", + "description": "Logs the user account out of the NGINX Controller platform and expires the authentication cookie.", + "operationId": "logout", + "responses": { + "204": { + "description": "The user was successfully logged out.", + "headers": { + "Set-Cookie": { + "schema": { + "type": "string", + "example": "session=; Expires=Jan 1 1970; Path=/" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/Internal" + }, + "503": { + "$ref": "#/components/responses/ServiceUnavailable" + } + } + } + }, + "/platform/login-providers": { + "get": { + "tags": [ + "Login Providers" + ], + "summary": "List all Active Authentication Providers", + "description": "Returns a list of all [authentication providers](#tag/Authentication-Providers) that are configured and ready for use.\n", + "operationId": "listReadyProviders", + "responses": { + "200": { + "description": "Successfully returned a list of the available authentication providers.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListReadyProviders" + }, + "example": { + "providers": [ + { + "type": "BASIC", + "name": "local" + } + ] + } + } + } + } + } + } + }, + "/platform/nodes": { + "get": { + "tags": [ + "Nodes" + ], + "summary": "List all Nodes", + "operationId": "getNodeList", + "description": "Gets information about the NGINX Controller control-plane nodes.", + "responses": { + "200": { + "description": "Successfully retrieved the NGINX Controller nodes.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodeList" + }, + "example": { + "items": [ + { + "currentStatus": { + "hostname": "host-1", + "ip": "192.0.2.1", + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-1", + "ip": "192.0.2.1" + }, + "metadata": { + "createTime": "2020-09-30T14:14:46Z", + "kind": "node", + "name": "host-1" + } + }, + { + "currentStatus": { + "hostname": "host-2", + "ip": "192.0.2.2", + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "createTime": "2020-09-30T14:19:13.755911Z", + "kind": "node", + "name": "host-2" + } + }, + { + "currentStatus": { + "hostname": "host-3", + "ip": "192.0.2.3", + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-3", + "ip": "192.0.2.3" + }, + "metadata": { + "createTime": "2020-09-30T14:19:16.155299Z", + "kind": "node", + "name": "host-3" + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "post": { + "tags": [ + "Nodes" + ], + "summary": "Create a Node", + "operationId": "addNode", + "description": "Creates a new NGINX Controller control-plane node.\n\nAfter a node has been created, you must install NGINX Controller on the node to finish adding the node to the cluster.\nIn the JSON response, look for the `install.sh` command and join-key located under `currentStatus.state.conditions.message`.\nThe `type` is `install`. Copy and run this command with the join-key on the new node to finish the setup.\n\nNote: (Optional) If you're adding a deleted node back to the cluster, you must uninstall NGINX Controller from the node before \nrunning the `install.sh` command with the new join-key. To uninstall NGINX Controller, run the uninstall script on the node: \n`/opt/nginx-controller/uninstall.sh`.\n", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Node" + }, + "example": { + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "name": "host-2" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the NGINX Controller node.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Node" + }, + "example": { + "currentStatus": { + "hostname": "host-2", + "ip": "192.0.2.2", + "state": { + "conditions": [ + { + "message": "install.sh --join-key ", + "type": "install" + } + ], + "selfConfigState": { + "configured": 0, + "configuring": 1, + "deleting": 0, + "error": 0, + "isConfigured": false, + "isConfiguring": true, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "createTime": "2020-10-01T10:03:39.228626Z", + "kind": "node", + "name": "host-2" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + }, + "501": { + "$ref": "#/components/responses/NotImplemented" + } + } + } + }, + "/platform/nodes/{nodeName}": { + "get": { + "tags": [ + "Nodes" + ], + "summary": "Get a Node", + "operationId": "getNode", + "description": "Gets information about an NGINX Controller control-plane node by name.", + "parameters": [ + { + "$ref": "#/components/parameters/nodeName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the specified NGINX Controller node.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Node" + }, + "example": { + "currentStatus": { + "hostname": "host-2", + "ip": "192.0.2.2", + "state": { + "conditions": [ + { + "message": "install.sh --join-key ", + "type": "install" + } + ], + "selfConfigState": { + "configured": 0, + "configuring": 1, + "deleting": 0, + "error": 0, + "isConfigured": false, + "isConfiguring": true, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "createTime": "2020-10-01T10:03:39.228626Z", + "kind": "node", + "name": "host-2" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Nodes" + ], + "summary": "Delete a Node", + "operationId": "deleteNode", + "description": "Deletes an NGINX Controller control-plane node by name.\nThe node's status is `isDeleting` while the workloads\nare being drained from it. Once draining is complete the node is deleted.\n\nNote: (Optional) You must uninstall NGINX Controller from the deleted node before you can add the node back to the cluster. \nTo uninstall NGINX Controller, run the uninstall script on the node: `/opt/nginx-controller/uninstall.sh`.\n", + "parameters": [ + { + "$ref": "#/components/parameters/nodeName" + } + ], + "responses": { + "202": { + "description": "Successfully scheduled the node to be deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Node" + }, + "example": { + "currentStatus": { + "hostname": "host-2", + "ip": "192.0.2.2", + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 1, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": true, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "createTime": "2020-10-01T10:03:39.228626Z", + "kind": "node", + "name": "host-2" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + }, + "501": { + "$ref": "#/components/responses/NotImplemented" + } + } + } + }, + "/platform/roles": { + "get": { + "tags": [ + "Roles" + ], + "summary": "List Roles", + "description": "Returns an unfiltered list of all Role resources.", + "operationId": "getRoles", + "responses": { + "200": { + "description": "Successfully retrieved a list of all of the Role resources.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleListResponse" + }, + "example": { + "items": [ + { + "currentStatus": { + "permissions": [ + { + "access": "FULL", + "path": "/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "FULL", + "path": "/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T21:29:59.866708Z", + "kind": "role", + "name": "admin" + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "post": { + "tags": [ + "Roles" + ], + "summary": "Create a Role", + "description": "Creates a new Role resource.", + "operationId": "createRole", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "desiredState": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/dev/" + }, + { + "access": "WRITE", + "path": "/services/environments/test/" + } + ] + }, + "metadata": { + "kind": "role", + "name": "role1", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Role resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "currentStatus": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/dev/" + }, + { + "access": "WRITE", + "path": "/services/environments/test/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/dev/" + }, + { + "access": "WRITE", + "path": "/services/environments/test/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "role", + "name": "role1", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/roles/{roleName}": { + "get": { + "tags": [ + "Roles" + ], + "summary": "Get a Role", + "description": "Returns information about a specific Role resource by its name.\n", + "operationId": "getRoleByName", + "parameters": [ + { + "$ref": "#/components/parameters/roleName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Role resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "currentStatus": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/test/" + }, + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/test/" + }, + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "role", + "name": "role1", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Roles" + ], + "summary": "Upsert a Role", + "description": "Creates a new Role resource or updates an existing Role resource.\n", + "operationId": "upsertRole", + "parameters": [ + { + "$ref": "#/components/parameters/roleName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "desiredState": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "metadata": { + "kind": "role", + "name": "role1", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Role resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "currentStatus": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "role", + "name": "role1", + "updateTime": "2020-02-24T22:53:14.340686Z", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "201": { + "description": "Successfully created the specified Role resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "currentStatus": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "role", + "name": "role1", + "updateTime": "2020-02-24T22:53:14.340686Z", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "Roles" + ], + "summary": "Delete a Role", + "description": "Deletes a specific Role resource.", + "operationId": "deleteRole", + "parameters": [ + { + "$ref": "#/components/parameters/roleName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the role. No content was returned." + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/users": { + "get": { + "tags": [ + "Users" + ], + "summary": "List all Users", + "operationId": "listUsers", + "description": "Returns an unfiltered list of all User resources.", + "responses": { + "200": { + "description": "Successfully retrieved a list of User resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserListResponse" + }, + "example": { + "items": [ + { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "John Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "John", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ] + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Create a User", + "operationId": "addUser", + "description": "Creates a new User resource.", + "requestBody": { + "description": "Defines the details to use for the new User resource.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "displayName": "John Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "*******", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ], + "groups": [ + { + "ref": "/platform/groups/guest" + } + ] + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested User resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "John Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ], + "groups": [ + { + "ref": "/platform/groups/guest" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "John", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ], + "groups": [ + { + "links": { + "rel": "/api/v1/platform/auth/groups/guest", + "name": "guest" + }, + "ref": "/platform/groups/guest" + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/platform/users/{userName}": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get a User", + "operationId": "getUser", + "description": "Gets information for an existing User resource.", + "parameters": [ + { + "$ref": "#/components/parameters/userName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested User resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "John Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "John", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "patch": { + "tags": [ + "Users" + ], + "summary": "Update a User", + "operationId": "updateUser", + "description": "Updates an existing User resource.", + "parameters": [ + { + "$ref": "#/components/parameters/userName" + } + ], + "requestBody": { + "description": "Defines the updates to make to the specified User resource.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "displayName": "Jane Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "Jane", + "lastName": "Doe", + "password": "********", + "verifyPassword": "********", + "roles": [ + { + "ref": "/platform/roles/new" + } + ] + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified User resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "Jane Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "Jane", + "lastName": "Doe", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/new" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "Jane", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/new", + "links": { + "rel": "/api/v1/platform/roles/new", + "name": "new" + } + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Users" + ], + "summary": "Delete a User", + "operationId": "deleteUser", + "description": "Deletes a User resource.", + "parameters": [ + { + "$ref": "#/components/parameters/userName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the user. No content was returned." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/platform/integrations": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "List all Integrations", + "description": "Returns an unfiltered list of integration accounts.", + "operationId": "listIntegrations", + "responses": { + "200": { + "description": "Successfully retreived a list of integration accounts.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListIntegrationResponse" + }, + "examples": { + "INTEGRATIONS": { + "$ref": "#/components/examples/ListIntegrationResponse" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Integrations" + ], + "summary": "Create an Integration account", + "description": "Creates a new integration account.", + "operationId": "addIntegration", + "requestBody": { + "description": "Defines the integration account to be added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSRequest" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponse" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkResponse" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "BadReq": { + "$ref": "#/components/examples/BadRequestError" + } + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "AlreadyExists": { + "$ref": "#/components/examples/AlreadyExistsError" + } + } + } + } + } + } + } + }, + "/platform/integrations/{integrationName}": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get an Integration account", + "description": "Gets information about a specific integration account.", + "operationId": "getIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponse" + } + } + } + } + }, + "404": { + "description": "Integration resource not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "NotFound": { + "$ref": "#/components/examples/NotFoundError" + } + } + } + } + } + } + }, + "put": { + "tags": [ + "Integrations" + ], + "summary": "Upsert an Integration account", + "description": "Creates a new integration account or updates an existing integration account.", + "operationId": "upsertIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSRequest" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkRequest" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponse" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkResponse" + } + } + } + } + }, + "201": { + "description": "Successfully updated the specified integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponse" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkResponse" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "BadReq": { + "$ref": "#/components/examples/BadRequestError" + } + } + } + } + } + } + }, + "patch": { + "tags": [ + "Integrations" + ], + "summary": "Update an Integration account", + "description": "Updates an existing integration account.", + "operationId": "updateIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIntegration" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSRequestForPatch" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkRequestForPatch" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIntegration" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponseForPatch" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkResponseForPatch" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "BadReq": { + "$ref": "#/components/examples/BadRequestError" + } + } + } + } + }, + "404": { + "description": "Integration resource not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "NotFound": { + "$ref": "#/components/examples/NotFoundError" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Integrations" + ], + "summary": "Delete an Integration account", + "description": "Deletes the specified integration account.", + "operationId": "deleteIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified integration account." + }, + "404": { + "description": "Integration not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "NotFound": { + "$ref": "#/components/examples/NotFoundError" + } + } + } + } + } + } + } + }, + "/platform/auth/groups": { + "get": { + "tags": [ + "Groups" + ], + "summary": "List Authentication Groups", + "description": "Returns an unfiltered list of all of the authentication groups.\n\nAn authentication group (or \"AuthN Group\") is a collection of Roles. All AuthN Groups are globally unique. You can assign AuthN Groups to external authentication provider properties (such as AD Groups).\n", + "operationId": "getGroups", + "responses": { + "200": { + "description": "Successfully retrieved a list of all authentication groups.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupListResponse" + }, + "example": { + "items": [ + { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/admin", + "links": { + "rel": "/api/v1/platform/roles/admin", + "name": "admin", + "displayName": "Admin Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T21:29:59.866708Z", + "kind": "group", + "name": "us-group-1" + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "post": { + "tags": [ + "Groups" + ], + "summary": "Add an Authentication Group", + "description": "Creates a new authentication group.", + "operationId": "createGroup", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "kind": "group", + "name": "group-1" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested authentication group.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/user", + "links": { + "rel": "/api/v1/platform/roles/user", + "name": "user", + "displayName": "User Role" + } + }, + { + "ref": "/platform/roles/custom-1", + "links": { + "rel": "/api/v1/platform/roles/custom-1", + "name": "custom-1", + "displayName": "First Custom Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "group", + "name": "group-1" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/auth/groups/{groupName}": { + "get": { + "tags": [ + "Groups" + ], + "summary": "Get an Authentication Group", + "description": "Returns information about a specific Authentication Group resource.\n", + "operationId": "getGroupByName", + "parameters": [ + { + "$ref": "#/components/parameters/groupName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Authentication Group resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/user", + "links": { + "rel": "/api/v1/platform/roles/user", + "name": "user", + "displayName": "User Role" + } + }, + { + "ref": "/platform/roles/custom-1", + "links": { + "rel": "/api/v1/platform/roles/custom-1", + "name": "custom-1", + "displayName": "First Custom Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "group", + "name": "group-1" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Groups" + ], + "summary": "Upsert an Authentication Group", + "description": "Creates a new Authentication Group resource or updates an existing Authentication Group.\n", + "operationId": "upsertGroup", + "parameters": [ + { + "$ref": "#/components/parameters/groupName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "kind": "group", + "name": "group-1" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified group.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/user", + "links": { + "rel": "/api/v1/platform/roles/user", + "name": "user", + "displayName": "User Role" + } + }, + { + "ref": "/platform/roles/custom-1", + "links": { + "rel": "/api/v1/platform/roles/custom-1", + "name": "custom-1", + "displayName": "First Custom Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "group", + "name": "group-1", + "updateTime": "2020-02-24T22:53:14.340686Z" + } + } + } + } + }, + "201": { + "description": "Successfully created the specified group.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/user", + "links": { + "rel": "/api/v1/platform/roles/user", + "name": "user", + "displayName": "User Role" + } + }, + { + "ref": "/platform/roles/custom-1", + "links": { + "rel": "/api/v1/platform/roles/custom-1", + "name": "custom-1", + "displayName": "First Custom Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "group", + "name": "group-1", + "updateTime": "2020-02-24T22:53:14.340686Z" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "Groups" + ], + "summary": "Delete an Authentication Group", + "description": "Deletes a specific authentication group.", + "operationId": "deleteGroup", + "parameters": [ + { + "$ref": "#/components/parameters/groupName" + } + ], + "responses": { + "204": { + "description": "Succesfully deleted the authentication group. No content was returned." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + } + }, + "components": { + "securitySchemes": { + "cookieAuth": { + "type": "apiKey", + "in": "cookie", + "name": "session" + } + }, + "parameters": { + "nodeName": { + "in": "path", + "name": "nodeName", + "description": "The name of the node.", + "schema": { + "type": "string" + }, + "required": true + }, + "roleName": { + "in": "path", + "name": "roleName", + "schema": { + "type": "string" + }, + "required": true, + "description": "The name of the Role.\n" + }, + "userName": { + "in": "path", + "name": "userName", + "schema": { + "type": "string", + "format": "email" + }, + "required": true, + "description": "The name for the User resource.\n" + }, + "code": { + "in": "path", + "name": "code", + "schema": { + "type": "string", + "minLength": 1 + }, + "required": true, + "description": "The password recovery code.\n" + }, + "IntegrationName": { + "name": "integrationName", + "in": "path", + "description": "The name of the integration account.", + "required": true, + "schema": { + "type": "string" + } + }, + "groupName": { + "in": "path", + "name": "groupName", + "schema": { + "type": "string" + }, + "required": true, + "description": "The name of the group.\n" + } + }, + "responses": { + "BadRequest": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 4005, + "message": "Error verifying the authorization: could not decode the request. Check the request body and try again." + } + } + } + }, + "Unauthorized": { + "description": "User authentication is invalid or missing.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 401, + "message": "authentication needed" + } + } + } + }, + "Forbidden": { + "description": "The request failed because of insufficient privileges.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 403, + "message": "unauthorized" + } + } + } + }, + "Internal": { + "description": "The request cannot be processed because of an internal server error.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 4000, + "message": "An internal error occurred while verifying the authorization. If the problem persists, contact the system administrator." + } + } + } + }, + "InternalServerError": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Conflict": { + "description": "The request failed due to a conflict with an existing Node resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotImplemented": { + "description": "The request method is not supported by the server in the current configuration and cannot be handled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "ServiceUnavailable": { + "description": "The request cannot be processed because service is unavailable. Please try resending the request. \n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error retrieving the user information. Try resending the request.", + "code": 2351 + } + } + } + }, + "StatusConflict": { + "description": "Wrong username and/or password.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error logging in: incorrect username or password. Check the login credentials, then try resending the request.", + "code": 2379 + } + } + } + }, + "NotFound": { + "description": "The specified authentication group was not found.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 8920, + "message": "Error getting or deleting group: group not found." + } + } + } + }, + "PaymentRequired": { + "description": "The request failed due to missing or expired license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 4700, + "details": [ + { + "description": "Error getting the NGINX Plus certificate and public key: the license is either expired or no license exists. Upload a valid license file and then try again." + } + ], + "message": "payment required." + } + } + } + }, + "FileNotFound": { + "description": "The requested certificate and key could not be found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 4600, + "details": [ + { + "description": "The requested resource was not found or is unavailable." + } + ], + "message": "The requested NGINX Plus license is not found or is unavailable." + } + } + } + } + }, + "schemas": { + "VerifyList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AuthRequest" + }, + "description": "Contains a list of authentication requests.\n" + } + } + }, + "AuthRequest": { + "type": "object", + "required": [ + "path", + "method" + ], + "example": { + "items": [ + { + "path": "/services/environments/test1", + "method": "DELETE", + "permitted": false + }, + { + "path": "/services/environments/test2", + "method": "PUT", + "permitted": true + } + ] + }, + "properties": { + "path": { + "type": "string" + }, + "method": { + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + "TRACE", + "PATCH", + "CONNECT", + "OPTIONS" + ] + }, + "permitted": { + "type": "boolean" + } + } + }, + "ErrorDetail": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "example": "Error doing : . This can lead to . Try to resolve the issue.", + "description": "A detailed error message returned by the server. \n\nThese messages contain the following information, where applicable:\n\n- What happened.\n- Why it happened.\n- What the consequences are (if any).\n- Recommended action to take to resolve the issue.\n" + } + } + }, + "ErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string", + "example": "Error doing .", + "description": "A human-readable message, in English, that describes the error.\n" + }, + "code": { + "type": "integer", + "example": 1234567, + "description": "A numeric error code that can be used to identify errors for support purposes.\n" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorDetail" + } + } + } + }, + "NodeList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Node" + } + } + } + }, + "Node": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "allOf": [ + { + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + { + "$ref": "#/components/schemas/NodeDef" + } + ] + }, + "desiredState": { + "$ref": "#/components/schemas/NodeDef" + } + } + }, + "NodeDef": { + "type": "object", + "properties": { + "hostname": { + "type": "string", + "format": "hostname", + "description": "The hostname for the NGINX Controller control-plane node. When adding a node, you must provide a hostname or an IP address, or you can specify both. The hostname must be the real hostname, which you can look up by running the `hostname` command." + }, + "ip": { + "type": "string", + "format": "ipv4", + "example": "192.0.2.0", + "description": "The IP address for the NGINX Controller control-plane node. When adding a node, you must provide an IP address or a hostname, or you can specify both." + } + } + }, + "SelfLinks": { + "type": "object", + "description": "The SelfLinks object contains a link from the resource to itself.\nThis object is used only in responses.\n", + "properties": { + "rel": { + "type": "string", + "example": "/api/v1/services/environments/prod", + "description": "`rel` contains the complete path fragment of a URI and can be used\nto construct a query to the object.\n" + } + } + }, + "ResourceMeta": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\*\\\"\\[\\]\\{\\}\\\\\\/%\\?:=&\\~\\^|#<>]+$", + "not": { + "type": "string", + "enum": [ + ".", + ".." + ] + }, + "minLength": 1, + "maxLength": 1024, + "example": "resource-name", + "description": "Resource name is a unique identifier for a resource within the context of a namespace.\nResource names must conform to [RFC 1738 Section 2.2](https://www.ietf.org/rfc/rfc1738.txt) and have a valid syntax for email addresses. The following rules are enforced:\n\n- do not utilize URL encoding;\n- do not include spaces;\n- do not use uppercase characters, for example, 'A-Z'; extended character sets are supported;\n- do not use the following characters: `\"`, `*`, `:`, `;`, `/`, `\\`, `%`, `?`, `hash`, `=`, `&`, `|`, `~`, `^`, `{`, `}`, `[`, `]`, `<`, `>`;\n- cannot start or end with an `@` sign;\n- cannot be only `.` or `..`\n\nFor example: For a collection resource located at\n\n`https://controller.example.com/api/v1/services/apps/shopping_@1`\n\nthe resource name is \"shopping_@1\".\n" + }, + "displayName": { + "type": "string", + "example": "My Display Name", + "description": "`displayName` is a user friendly resource name. It can be used to define \na longer, and less constrained, name for a resource.\n\nDisplay names:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "description": { + "type": "string", + "example": "This is a sample description string. It provides information about the resource.", + "description": "`description` is a free-form text property. You can use it to provide information that helps \nto identify the resource.\n\nDescriptions:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "kind": { + "type": "string", + "example": "-", + "description": "Kind is a string representation of an API resource's data type.\nIt is assigned by the server and cannot be changed. \n\nWhen creating a `kind`, the server uses hyphens to connect word segments; \nsingleton and collection item resources are not pluralized.\n" + }, + "uid": { + "type": "string", + "format": "uuid", + "example": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "description": "Unique Identifier (UID)\n\nUID is a unique identifier in time and space for a resource. \nWhen you create a resource, the server assigns a UID to the resource.\n\nRefer to [IETF RFC 4122](https://tools.ietf.org/html/rfc4122) for more information.\n" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ], + "description": "You can assign `tags` to a resource as a way to help map, scope, \nand organize resources. \n\nThe system uses tag selectors to specify selection criteria that \nmatch resources that have particular tags.\n" + }, + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "The `ref` field contains a reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/SelfLinks" + }, + "createTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was created.\n\nCreate time is not guaranteed to be set in \"happens-before\" order\nacross separate operations.\n\nIn JSON format, `create_time` type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n\nCreate Time is assigned by the server and cannot be changed.\n" + }, + "updateTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was last modified.\n\nResources that have never been updated do not have an `update_time` stamp.\n\nThe default value for resources that have never been updated is the local \nlanguage-specific equivalent of \"null\".\n\nIn JSON format, `update_time` type is encoded as a string as described in \n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n" + } + } + }, + "ConfigStateTally": { + "type": "object", + "properties": { + "isConfigured": { + "type": "boolean", + "description": "The configuration operation is complete." + }, + "isConfiguring": { + "type": "boolean", + "description": "The configuration of the resource, or of its child(ren), is in process." + }, + "isError": { + "type": "boolean", + "description": "An error occurred while configuring the resource or its child(ren)." + }, + "isDeleting": { + "type": "boolean", + "description": "A delete operation is in progress for the resource or its child(ren)." + }, + "total": { + "type": "integer", + "description": "The total number of resources to which the configuration operation applies." + }, + "configured": { + "type": "integer", + "description": "The number of resources that have a complete and valid configuration." + }, + "configuring": { + "type": "integer", + "description": "The number of resources that are in the process of being configured." + }, + "error": { + "type": "integer", + "description": "The number of resources that have encountered an error during the configuration process." + }, + "deleting": { + "type": "integer", + "description": "The number of resources that are in the process of being deleted." + } + } + }, + "ConfigCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The condition type." + }, + "message": { + "type": "string", + "description": "A human-readable message that provides additional information about the configuration operation." + } + } + }, + "ConfigState": { + "type": "object", + "description": "A representation of the resource's current configuration state \nthat comprises the status of the resource itself (`selfConfigState`) and any child \nresources (`childrenConfigState`).\n\nThe conditions array provides additional information during configuration changes.\n", + "properties": { + "selfConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "childrenConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigCondition" + } + } + } + }, + "RoleListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Role" + }, + "description": "Contains list of Role objects.\n" + } + } + }, + "Role": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/RoleDef" + }, + "currentStatus": { + "$ref": "#/components/schemas/RoleDef" + } + } + }, + "RoleDef": { + "type": "object", + "required": [ + "permissions" + ], + "description": "A Role is a collection of permissions and child Roles. All Roles are globally unique. You can assign Roles to users or to other Roles.\n", + "properties": { + "permissions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/Permission" + } + } + } + }, + "Permission": { + "type": "object", + "required": [ + "access", + "path" + ], + "description": "A Permission is a pair consisting of a path or object and the desired level of access. Permissions govern Users ability to access specific paths or objects within an Environment.\n", + "properties": { + "path": { + "type": "string", + "example": "/services/environments/dev/", + "pattern": "^(\\/[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\\"\\[\\]\\{\\}\\\\\\/]*)+", + "description": "The path represents an area of the platform to which the Role grants access. For example, to allow the Role to access an Environment named \"dev\", you would define the path \"/services/environments/dev\".\n" + }, + "access": { + "type": "string", + "enum": [ + "NONE", + "READ", + "WRITE", + "FULL" + ], + "description": "Access determines the Role's ability to access a path or object. The options are:\n* NONE: Does not have any access to the path or object\n* READ: Has read only access (HTTP GET requests)\n* WRITE: Has read and write access (POST, PUT, PATCH requests) but cannot delete\n* FULL: Has read, write and delete access\n" + } + } + }, + "ListAuthProviders": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AuthProvider" + } + } + } + }, + "AuthProvider": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/AuthProviderDef" + }, + "desiredState": { + "$ref": "#/components/schemas/AuthProviderDef" + } + } + }, + "AuthProviderDef": { + "type": "object", + "properties": { + "provider": { + "oneOf": [ + { + "$ref": "#/components/schemas/ActiveDirectory" + }, + { + "$ref": "#/components/schemas/AzureActiveDirectory" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "ACTIVE_DIRECTORY": "#/components/schemas/ActiveDirectory", + "AZURE_ACTIVE_DIRECTORY": "#/components/schemas/AzureActiveDirectory" + } + }, + "example": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + } + } + } + }, + "ActiveDirectory": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ACTIVE_DIRECTORY" + ] + }, + "status": { + "type": "string", + "description": "This field is read only and will only be reflected in currentStatus and ignored in desiredState.", + "enum": [ + "CONNECTED_BOUND", + "CONNECTED_BIND_FAILED", + "SSL_CA_FAILURE", + "CONNECTION_FAILURE", + "PENDING" + ] + }, + "domain": { + "type": "string", + "description": "The LDAP domain to authenticate against. The domain is unique per each configured Active Directory authentication provider. This field cannot be updated.\n", + "pattern": "^((DC|OU)=[^,=<>]+,)*(DC=[^,,=<>]+)$", + "example": "DC=mydomain,DC=example,DC=com" + }, + "defaultLoginDomain": { + "type": "string", + "description": "The login domain to use when a user authenticates with only a username rather than specifying DOMAIN\\username or username@domain.fqdn. \n", + "example": "mydomain.mycompany.com" + }, + "groupSearchFilter": { + "type": "string", + "description": "The search filter to use when finding users within a root domain.\n", + "example": "(objectClass=group)" + }, + "groupMemberAttribute": { + "type": "string", + "description": "The LDAP attribute to use for specifying membership in an AD Group.\n", + "example": "memberof" + }, + "userFormat": { + "type": "string", + "enum": [ + "USER_DOMAIN", + "UPN" + ], + "description": "The username format. \n\n- UPN = username@domain\n- USER_DOMAIN = domain/user\n", + "example": "UPN" + }, + "connection": { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "$ref": "#/components/schemas/AuthConnection" + } + }, + "groupMappings": { + "type": "array", + "description": "Maps AD Group(s) to NGINX Controller Group(s).\n", + "items": { + "$ref": "#/components/schemas/GroupMapping" + } + }, + "bindUser": { + "$ref": "#/components/schemas/BindUser" + }, + "pollIntervalSec": { + "type": "integer", + "description": "Time, in seconds, between refresh of AD information, including the organization unit list.\n", + "minimum": 300, + "default": 3600 + }, + "groupCacheTimeSec": { + "type": "integer", + "description": "Time, in seconds, for which the list of organizational units is honored before being considered stale. \n> This value should be double the configured `pollIntervalSec`.\n", + "minimum": 600, + "default": 7200 + }, + "honorStaleGroups": { + "type": "boolean", + "default": false, + "description": "Controls whether a stale AD Group list should be honored when authorizing and authenticating users.\n" + }, + "filteredGroups": { + "type": "array", + "description": "List of groups in the AD that satifies the `groupSearchFilter` field. This field is read only. \n", + "items": { + "type": "string" + } + } + }, + "required": [ + "type" + ] + }, + "AzureActiveDirectory": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AZURE_ACTIVE_DIRECTORY" + ] + }, + "status": { + "type": "string", + "description": "This field is read-only, it is reflected in currentStatus and ignored in desiredState.", + "enum": [ + "CONNECTED_BOUND", + "CONNECTION_FAILURE", + "PENDING" + ] + }, + "groupFilter": { + "type": "string", + "description": "The filter attribute is used to filter groups in an Azure AD tenant. See [here](https://docs.microsoft.com/en-us/graph/query-parameters#filter-parameter) for more details.\n", + "example": "groupTypes/any(c:c+eq+'Unified')" + }, + "oidcConfig": { + "$ref": "#/components/schemas/OIDCConfig" + }, + "groupMappings": { + "type": "array", + "description": "Maps Azure AD Group(s) to NGINX Controller Group(s).\n", + "items": { + "$ref": "#/components/schemas/GroupMapping" + } + }, + "pollIntervalSec": { + "type": "integer", + "description": "Time (sec) interval for refreshing Azure AD information, including the groups and group membership information.\n", + "minimum": 300, + "default": 3600 + }, + "groupCacheTimeSec": { + "type": "integer", + "description": "Time (sec) interval for which the group and group membership information are honored before being considered stale.\n> This value should be double the configured `pollIntervalSec`.\n", + "minimum": 600, + "default": 7200 + }, + "honorStaleGroups": { + "type": "boolean", + "default": false, + "description": "Controls whether a stale Azure AD group membership information is honored or not when authorizing and authenticating users.\n" + }, + "filteredGroups": { + "type": "array", + "description": "List of groups in the Azure AD which satisfy the `groupFilter` field. This field is read-only.\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "type" + ] + }, + "AuthConnection": { + "type": "object", + "description": "Connection parameters for an external authentication provider.\n", + "properties": { + "uri": { + "type": "string", + "description": "Connection URI. \n", + "format": "uri", + "pattern": "^ldaps?:\\/\\/([\\w\\-]+\\.)+([\\w\\-]*)(:[0-9]+)?$", + "example": "ldap://dc1.example.com" + }, + "sslMode": { + "type": "string", + "description": "SSL connection parameters.\n- `PLAIN_TEXT`: (Insecure) Unencrypted connection. Does not require SSL certificates.\n- `REQUIRE`: (Default) Require an SSL connection. Unencrypted connections will fail. The server identity is not verified.\n- `VERIFY_CA`: (Most secure) Verify the certificate authority (CA) of the Active Directory connection. The server is verified by checking the certificate chain up to the root certificate stored on the client.\n\n> **Note**: For Production environments, we strongly advise using `VERIFY_CA` for the SSL mode in order to prevent server spoofing.\n", + "enum": [ + "PLAIN_TEXT", + "REQUIRE", + "VERIFY_CA" + ] + }, + "rawCa": { + "type": "string", + "description": "Raw Certificate", + "example": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + }, + "required": [ + "uri", + "sslMode" + ] + }, + "GroupMapping": { + "type": "object", + "description": "Authentication provider group to NGINX Controller group mapping.\n", + "properties": { + "caseSensitive": { + "type": "boolean", + "description": "Controls whether or not you want to match the external name exactly or if the match should be case-insensitive.", + "default": false + }, + "external": { + "type": "string", + "description": "The name of the external group.", + "example": "Engineering-US-West" + }, + "internal": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "required": [ + "external", + "internal" + ] + }, + "BindUser": { + "oneOf": [ + { + "$ref": "#/components/schemas/BindUserPassword" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "PASSWORD": "#/components/schemas/BindUserPassword" + } + } + }, + "BindUserPassword": { + "type": "object", + "description": "Credentials used to access data within the AD.\n", + "properties": { + "type": { + "type": "string", + "description": "authentication type.", + "enum": [ + "PASSWORD" + ] + }, + "username": { + "type": "string", + "minLength": 1, + "description": "AD bind username." + }, + "password": { + "type": "string", + "format": "password", + "minLength": 1, + "description": "AD bind user password." + } + }, + "required": [ + "type", + "username", + "password" + ] + }, + "OIDCConfig": { + "type": "object", + "description": "OpenID Connect config for an external identity provider.\n", + "properties": { + "providerURI": { + "type": "string", + "description": "Identity provider URL. It contains the tenant ID for Azure Identity provider. \n", + "format": "uri", + "example": "https://login.microsoftonline.com/d45dfd66-6a3b-40d1-9be0-bf8327d81c56/v2.0" + }, + "clientID": { + "type": "string", + "description": "The Application (client) ID that the identity provider assigns to the NGINX Controller app. For Azure identity providers, you can find it in the portal App registrations.\n", + "example": "781729sd-87b2-4333-9730-338d3a87340b" + }, + "clientSecret": { + "type": "string", + "description": "A secret string that the application uses to prove its identity when requesting a token.\n", + "example": "Ic767hk_8anvoip76v" + }, + "scopes": { + "type": "array", + "description": "OpenID Connect Clients use scope values to specify what access privileges are being requested. See [here](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes) for more information.", + "items": { + "type": "string" + }, + "default": [ + "openid", + "email", + "profile" + ] + }, + "redirectURI": { + "type": "string", + "description": "The redirect URI of NGINX controller, where the identity provider sends authentication responses to. This field is read-only. It is reflected in currentStatus and ignored in desiredState. Set this to be one of the redirect URIs in app registration for NGINX Controller in the identity provider's portal.", + "format": "uri", + "example": "https://54.212.107.157/api/v1/platform/oidc-handler" + } + }, + "required": [ + "providerURI", + "clientID", + "clientSecret" + ] + }, + "NamedLinks": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfLinks" + }, + { + "type": "object", + "description": "Contains information about the object being referred to.\n\nThese are generally details -- like the object name and display name --\nthat are useful to a consumer of the API that performs further\nprocessing. \n\nThis object is only present in responses.\n \n", + "properties": { + "name": { + "type": "string", + "example": "production", + "description": "The name of the linked resource.\n" + }, + "displayName": { + "type": "string", + "example": "Production Environment", + "description": "A user friendly resource name." + } + } + } + ] + }, + "ResourceRef": { + "type": "object", + "required": [ + "ref" + ], + "properties": { + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "A reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "GlobalSettings": { + "type": "object", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "properties": { + "agentSettings": { + "$ref": "#/components/schemas/AgentSettingsData" + }, + "platformSettings": { + "$ref": "#/components/schemas/PlatformSettingsData" + } + } + }, + "currentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "agentSettings": { + "$ref": "#/components/schemas/AgentSettingsData" + }, + "platformVersion": { + "$ref": "#/components/schemas/PlatformVersionData" + }, + "platformSettings": { + "$ref": "#/components/schemas/PlatformSettingsData" + } + } + } + } + }, + "AgentSettingsData": { + "type": "object", + "description": "Sets the global settings for NGINX Controller Agent.", + "properties": { + "enableNGINXConfigAnalyzer": { + "type": "boolean", + "description": "Disable or enable NGINX configuration file analysis.", + "default": true + }, + "enablePeriodicNGINX-T": { + "type": "boolean", + "description": "Disable or enable periodic NGINX configuration syntax checking with \\\"nginx -t\\\".", + "default": false + }, + "enableAnalyzeSSLCertificates": { + "type": "boolean", + "description": "Disable or enable analyzing SSL certs.", + "default": true + }, + "apiKey": { + "type": "string", + "description": "Access token to retrieve Agent installer." + } + } + }, + "PlatformVersionData": { + "type": "object", + "description": "Returns the version information for NGINX Controller and its sub-components.", + "required": [ + "version", + "buildNumber", + "components" + ], + "properties": { + "version": { + "type": "string", + "description": "The version number." + }, + "buildNumber": { + "type": "string", + "description": "Build number of the artifact used for installation." + }, + "components": { + "type": "array", + "description": "The NGINX Controller sub-components.", + "items": { + "$ref": "#/components/schemas/componentDef" + } + } + }, + "example": { + "version": "3.0.0", + "buildNumber": "2313201", + "components": [ + { + "application": "secrets", + "version": "0.9.1" + }, + { + "application": "platform-mgr", + "version": "0.2.2" + } + ] + } + }, + "componentDef": { + "type": "object", + "required": [ + "application", + "version" + ], + "properties": { + "application": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "example": { + "application": "secrets", + "version": "0.9.1" + } + }, + "PlatformSettingsData": { + "type": "object", + "description": "Sets the platform settings for NGINX Controller.", + "properties": { + "apigwCert": { + "type": "string", + "description": "SSL/TLS certificate (PEM format) for API Gateway.\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n", + "example": "-----BEGIN CERTIFICATE-----\\n MIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\n MiJVGawyxDzBm2UhzNOE0ABHfjAgM6PAYmtMhhQawk6bmttXYhJeqhLSji4LEj5d\\n Z4FmXQ5rWM0RWBs=\\n -----END CERTIFICATE-----" + }, + "apigwKey": { + "type": "string", + "writeOnly": true, + "description": "Private key (PEM format) for API Gateway. Key must match certificate.\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n", + "example": "-----BEGIN PRIVATE KEY-----\\n MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALSQBtRafNJtTqN0\\n nYiZq6TZUsHjfG2R9PlK6jsvno9O6amN96Al6ZSTTDjhr4VU7/RJ0p/cisiCboCX\\n 4cCq6lFKpIpeZJI=\\n -----END PRIVATE KEY-----" + }, + "FQDN": { + "type": "string", + "description": "Fully qualified domain name for the NGINX Controller server, which users and Controller Agents will use when connecting to NGINX Controller." + }, + "smtpHost": { + "type": "string", + "description": "SMTP host" + }, + "smtpPort": { + "type": "integer", + "description": "SMTP port", + "minimum": 1, + "maximum": 65535 + }, + "smtpAuthentication": { + "type": "boolean", + "description": "Specify if SMTP server requires username and password." + }, + "smtpUseTLS": { + "type": "boolean", + "description": "Specify if SMTP should use TLS." + }, + "smtpFrom": { + "type": "string", + "description": "Specify the email to show in the 'FROM' field." + }, + "smtpUser": { + "type": "string", + "description": "SMTP user (required when smtpAuthentication is enabled)." + }, + "smtpPassword": { + "type": "string", + "description": "SMTP password (required when smtpAuthentication is enabled)." + }, + "dbType": { + "type": "string", + "enum": [ + "external", + "embedded" + ], + "description": "Config database type - embedded or external. Read-only.", + "readOnly": true, + "example": "embedded" + }, + "dbHost": { + "type": "string", + "description": "Config database host (read-only if using an embedded Config database)." + }, + "dbPort": { + "type": "integer", + "description": "Config database port (read-only if using internal Config database).", + "minimum": 1, + "maximum": 65535 + }, + "dbUser": { + "type": "string", + "description": "Config database username (read-only if using internal Config database)." + }, + "dbPassword": { + "type": "string", + "description": "Config database password (read-only if using internal Config database)." + }, + "dbUseTLS": { + "type": "boolean", + "description": "Specify wether the Config database connection uses TLS or not (read-only if using internal Config database)." + }, + "dbCA": { + "type": "string", + "description": "SSL/TLS Certificate Authority certificate (PEM format) for verifying Config database server certificate. Only required if server certificate is signed by a private CA.\nBecause JSON does not support multi-line strings, you must replace line feed and/or carriage return characters with their literal equivalents as two characters - `\\n`, a backslash and letter `n`.\nRead-only if using internal Config database.\n", + "example": "-----BEGIN CERTIFICATE-----\\nMIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\nZ4FmXQ5rWM0RWBs=\\n-----END CERTIFICATE-----" + }, + "dbClientCert": { + "type": "string", + "description": "SSL/TLS client certificate (PEM format) for authenticating when connecting to the Config database.\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\nRead-only if using internal Config database.\n", + "example": "-----BEGIN CERTIFICATE-----\\nMIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\nZ4FmXQ5rWM0RWBs=\\n-----END CERTIFICATE-----" + }, + "dbClientKey": { + "type": "string", + "description": "Private key (PEM format) for Config database connection. Key must match certificate.\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\nRead-only if using internal Config database.\n", + "example": "-----BEGIN PRIVATE KEY-----\\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALSQBtRafNJtTqN0\\nnYiZq6TZUsHjfG2R9PlK6jsvno9O6amN96Al6ZSTTDjhr4VU7/RJ0p/cisiCboCX\\n4cCq6lFKpIpeZJI=\\n-----END PRIVATE KEY-----" + }, + "tsdbVolumeType": { + "type": "string", + "description": "Time Series database volume type.", + "enum": [ + "local", + "nfs", + "aws" + ], + "readOnly": true + }, + "tsdbNFSHost": { + "type": "string", + "description": "Time Series database NFS host.", + "readOnly": true + }, + "tsdbNFSPath": { + "type": "string", + "description": "Time Series database NFS path.", + "readOnly": true + }, + "tsdbAWSVolumeID": { + "type": "string", + "description": "Time Series database AWS Volume ID.", + "readOnly": true + }, + "clusterFloatingIP": { + "type": "string", + "pattern": "^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^$", + "description": "Floating IPv4 address used to communicate with Controller in multinode/cluster mode.\nThis setting is only valid for local (non-cloud) installations. Set empty value to disable floating IP.\n" + }, + "clusterLoadBalancer": { + "type": "string", + "description": "Hostname or IP of the external cluster load balancer. Read-only.", + "readOnly": true + } + } + }, + "UserDef": { + "type": "object", + "required": [ + "firstName", + "lastName", + "email", + "password" + ], + "properties": { + "account": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": 1, + "deprecated": true, + "description": "The account number of the tentant." + }, + "id": { + "type": "integer", + "example": 123, + "description": "Account ID" + }, + "firstName": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "John", + "description": "Given name." + }, + "lastName": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "Doe", + "description": "Surname." + }, + "lastLogin": { + "type": "integer", + "example": 1570132969, + "description": "Unix time (seconds since Epoch) of last login." + }, + "email": { + "type": "string", + "example": "john.doe@example.com", + "description": "An email address that serves as the account's username. This must match the resource's metadata.name property.", + "format": "email" + }, + "authn": { + "type": "string", + "enum": [ + "amplify" + ] + }, + "password": { + "type": "string", + "format": "password", + "minLength": 8, + "maxLength": 64, + "description": "Passwords must meet the following requirements:\n\n - length must be between 8 and 64 characters\n - must contain at least 1 letter\n - must contain at least 1 number\n - must be different from the old password\n\n Dictionary words, mangled dictionary words, or systematic passwords like '1234567a' are not allowed.\n" + }, + "apiKey": { + "type": "string", + "example": "761ab961448865d86ef71c67fd74432b", + "deprecated": true, + "description": "User api key." + }, + "isEnabled": { + "type": "boolean", + "description": "Indicates if the account is enabled.", + "default": false + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "groups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "User": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/UserDef" + }, + "currentStatus": { + "$ref": "#/components/schemas/UserDef" + } + } + }, + "UpdateUser": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/UpdateUserDef" + }, + "currentStatus": { + "$ref": "#/components/schemas/UserDef" + } + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "Jane Doe", + "description": "NGINX Controller user with a production environment role." + }, + "desiredState": { + "firstName": "Jane", + "lastName": "Doe", + "password": "********", + "verifyPassword": "********", + "roles": [ + { + "ref": "/platform/roles/new" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "Jane", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ] + } + } + }, + "UpdateUserDef": { + "type": "object", + "properties": { + "firstName": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "Jane", + "description": "Given name." + }, + "lastName": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "Doe", + "description": "Surname." + }, + "password": { + "type": "string", + "format": "password", + "minLength": 8, + "maxLength": 64, + "description": "The user's password must meet the following requirements:\n\n - Length must be between 8 and 64 characters\n - Must contain at least 1 letter\n - Must contain at least 1 number\n - Must be different from the old password\n - Dictionary words, mangled dictionary words, or systematic passwords like '1234567a' are not allowed\n \n" + }, + "verifyPassword": { + "type": "string", + "format": "password", + "description": "The user's current password. Users must verify their current password to make updates to their user profiles. The current password does not need to be verified when an admin user updates other users' profiles." + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "example": { + "firstName": "Jane", + "lastName": "Doe", + "password": "********", + "verifyPassword": "********", + "roles": [ + { + "ref": "/platform/roles/new" + } + ] + } + }, + "UserListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + }, + "description": "List of User resources." + } + }, + "example": { + "items": [ + { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "John Doe", + "description": "NGINX Controller user with production environment role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "John", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ] + } + } + ] + } + }, + "GlobalFeatures": { + "type": "object", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "properties": { + "featureFlags": { + "type": "array", + "description": "Flags to describe or extend NGINX Controller behavior (optional).", + "items": { + "$ref": "#/components/schemas/FeatureFlagsDef" + } + } + } + }, + "currentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "featureFlags": { + "type": "array", + "description": "Flags to describe or extend NGINX Controller behavior (optional).", + "items": { + "$ref": "#/components/schemas/FeatureFlagsDef" + } + } + } + } + } + }, + "FeatureFlagsDef": { + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "example": { + "name": "reserved", + "value": "true" + } + }, + "ResetPasswordRequest": { + "type": "object", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + } + } + }, + "ResetPassword": { + "type": "object", + "required": [ + "desiredState", + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "required": [ + "password" + ], + "properties": { + "password": { + "type": "string", + "format": "password", + "example": "TestImpl45!", + "minLength": 8, + "maxLength": 64, + "description": "The user's password must meet the following requirements:\n - Length must be between 8 and 64 characters\n - Must contain at least 1 letter\n - Must contain at least 1 number\n - Must be different from the old password\n - Dictionary words, mangled dictionary words, or systematic passwords like '1234567a' are not allowed.\n" + } + } + } + } + }, + "LicenseRequest": { + "type": "object", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "string", + "format": "password", + "description": "License file contents, encoded as Base64" + } + } + }, + "PutLicenseRequest": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "string", + "format": "password", + "description": "The customer association token or NGINX Controller license, which can be downloaded from your [MyF5](account.f5.com/myf5) account. The license must be formatted as a base64-encoded string, while the association token is unencoded." + } + } + } + } + }, + "License": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseData" + } + } + } + }, + "currentStatus": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseData" + } + } + } + } + } + }, + "LicenseResponse": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "properties": { + "content": { + "type": "string", + "format": "password", + "description": "Redacted license information." + }, + "items": { + "type": "array", + "deprecated": true, + "items": { + "$ref": "#/components/schemas/LicenseData" + } + } + } + }, + "currentStatus": { + "type": "object", + "properties": { + "subscription": { + "$ref": "#/components/schemas/Subscription" + }, + "entitlement": { + "$ref": "#/components/schemas/Entitlement" + }, + "state": { + "type": "object", + "required": [ + "currentInstance" + ], + "properties": { + "currentInstance": { + "$ref": "#/components/schemas/CurrentInstance" + } + } + }, + "items": { + "type": "array", + "deprecated": true, + "items": { + "$ref": "#/components/schemas/LicenseData" + } + } + } + } + } + }, + "LicenseData": { + "type": "object", + "required": [ + "product", + "expiry", + "instanceCount", + "serial", + "version", + "type", + "id" + ], + "description": "Defines the features of a given license", + "properties": { + "product": { + "type": "string", + "description": "The name of the product the license enables.", + "example": "NGINX Controller Monitoring" + }, + "expiry": { + "type": "string", + "format": "date-time", + "description": "The date on which the license expires. Represented in Coordinated Universal Time (UTC), specifically using the ISO 8601 standard.", + "example": "1996-02-26T00:00:00.000Z" + }, + "instanceCount": { + "type": "integer", + "description": "The number of instances that are allowed by the license.", + "example": 20 + }, + "serial": { + "type": "integer", + "description": "A unique identifier for the license.", + "example": 20145 + }, + "version": { + "type": "integer", + "description": "The product version number.", + "example": 1 + }, + "type": { + "type": "string", + "description": "The license type. Lowercase values are deprecated.", + "enum": [ + "production", + "beta", + "internal", + "partner", + "trial", + "PRODUCTION", + "BETA", + "INTERNAL", + "PARTNER", + "TRIAL", + "PAID", + "EVAL" + ] + }, + "id": { + "type": "string", + "description": "Unique identifier for a product.", + "enum": [ + "UNKNOWN", + "ADC", + "APIM", + "ANALYTICS" + ] + } + } + }, + "Subscription": { + "type": "object", + "required": [ + "id" + ], + "description": "Defines the features of a subscription.", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b6d7c577-b708-44ad-839c-9743f85fcf7c", + "description": "Subscription ID." + } + } + }, + "Entitlement": { + "type": "object", + "required": [ + "features" + ], + "description": "Defines the elements of an entitlement.", + "properties": { + "features": { + "type": "array", + "description": "Product features.", + "items": { + "$ref": "#/components/schemas/Feature" + } + } + } + }, + "Feature": { + "type": "object", + "required": [ + "name", + "unitOfMeasure", + "id", + "type" + ], + "description": "Defines a product feature, consumption metric, and metric usage limit.", + "properties": { + "name": { + "type": "string", + "description": "Name of the feature.", + "example": "NGINX Controller Load Balancing" + }, + "limit": { + "type": "integer", + "description": "Maximum limit for the consumption metric.", + "example": 1, + "minimum": 0 + }, + "unlimited": { + "type": "boolean", + "description": "Indicates whether there is a limit for the consumption metric or not.", + "example": true + }, + "unitOfMeasure": { + "$ref": "#/components/schemas/UnitOfMeasure" + }, + "type": { + "type": "string", + "description": "The license type.", + "example": "PAID", + "enum": [ + "PRODUCTION", + "BETA", + "INTERNAL", + "PARTNER", + "TRIAL", + "PAID", + "EVAL" + ] + }, + "id": { + "$ref": "#/components/schemas/FeatureID" + }, + "expiry": { + "type": "string", + "format": "date-time", + "description": "The date on which the license expires. Represented in Coordinated Universal Time (UTC), specifically using the ISO 8601 standard.", + "example": "1996-02-26T00:00:00.000Z" + }, + "gracePeriodDays": { + "type": "integer", + "description": "Number of grace period days after the license expires.", + "example": 30, + "minimum": 0 + } + } + }, + "CurrentInstance": { + "type": "object", + "required": [ + "type", + "version", + "status", + "features", + "configState" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "description": "Unique identifier for the current instance." + }, + "telemetryLastReported": { + "type": "string", + "format": "date-time", + "description": "Date and time when telemetry data was last reported from the current instance. Represented in Coordinated Universal Time (UTC), specifically using the ISO 8601 standard.", + "example": "1996-02-26T00:00:00.000Z" + }, + "type": { + "type": "string", + "example": "NGINX Controller", + "description": "Product type." + }, + "status": { + "type": "string", + "description": "Status of the current instance with respect to the license.\n\n- `NONE`: The current instance is not yet licensed.\n- `INVALID`: The current instance has at least one entitlement in non-functional license status.\n- `ENFORCED`: The current instance has at least one entitlement in enforced license status and no entitlements in non-functional status.\n- `GRACE`: The current instance has at least one entitlement in grace period license status and no entitlements in enforced or non-functional status.\n- `VALID`: The current instance has valid entitlement(s) that have no adverse license statuses.\n- `CORRUPTED`: The license for the current instance is corrupted. Upload the license file again to rectify the status.\n", + "enum": [ + "NONE", + "INVALID", + "ENFORCED", + "GRACE", + "VALID", + "CORRUPTED" + ] + }, + "version": { + "type": "string", + "example": "3.3.0", + "description": "Product version." + }, + "configState": { + "$ref": "#/components/schemas/ConfigState" + }, + "features": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeatureStatus" + }, + "description": "List of the available features and their current usage." + } + } + }, + "FeatureStatus": { + "type": "object", + "required": [ + "name", + "unitOfMeasure", + "id" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the product feature.", + "example": "NGINX Controller Load Balancing" + }, + "used": { + "type": "number", + "description": "Amount of the feature used by the current NGINX Controller instance.", + "example": 1, + "minimum": 0 + }, + "aggregateUsed": { + "type": "number", + "description": "Amount of the feature used by all NGINX Controller instances in the bucket.", + "example": 1, + "minimum": 0 + }, + "remaining": { + "type": "number", + "description": "Amount of the feature remaining.", + "example": 1, + "minimum": 0 + }, + "unitOfMeasure": { + "$ref": "#/components/schemas/UnitOfMeasure" + }, + "id": { + "$ref": "#/components/schemas/FeatureID" + }, + "daysUntilExpiry": { + "type": "integer", + "description": "Defines when the current entitlement expires.", + "example": 20, + "minimum": 0 + }, + "gracePeriodRemainingDays": { + "type": "integer", + "description": "Defines the remaining grace period days after the license expires.", + "minimum": 0 + } + } + }, + "UnitOfMeasure": { + "type": "string", + "enum": [ + "INSTANCES", + "WORKLOADS", + "DATA_PER_HOUR_IN_GB", + "SUCCESSFUL_API_CALLS_IN_MILLIONS", + "SUCCESSFUL_API_CALLS" + ], + "description": "Unit of measure used for computing consumption.", + "example": "WORKLOADS" + }, + "FeatureID": { + "type": "string", + "enum": [ + "UNKNOWN", + "ADC", + "APIM", + "ANALYTICS" + ], + "example": "ADC", + "description": "Unique identifier for a product feature." + }, + "LicenseName": { + "type": "string", + "description": "Name of the License resource.", + "example": "controller-provided" + }, + "NginxPlusLicensesList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NginxPlusLicenseResponse" + } + } + } + }, + "NginxPlusLicenseResponse": { + "type": "object", + "required": [ + "metadata", + "currentStatus", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/NginxPlusKeys" + }, + "desiredState": { + "$ref": "#/components/schemas/NginxPlusKeys" + } + }, + "example": { + "metadata": { + "name": "controller-provided", + "ref": "/platform/licenses/nginx-plus-licenses/controller-provided", + "kind": "license" + }, + "currenStatus": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + }, + "desiredState": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + } + } + }, + "NginxPlusKeys": { + "type": "object", + "required": [ + "certKey", + "privateKey" + ], + "properties": { + "certKey": { + "type": "string", + "description": "Contents of the certificate file that is required to install NGINX Plus.\n" + }, + "privateKey": { + "type": "string", + "description": "Contents of the key file that is required to install NGINX Plus.\n" + } + } + }, + "Login": { + "type": "object", + "properties": { + "credentials": { + "oneOf": [ + { + "$ref": "#/components/schemas/BasicAuth" + }, + { + "$ref": "#/components/schemas/ActiveDirectoryAuth" + }, + { + "$ref": "#/components/schemas/AzureActiveDirectoryAuth" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "BASIC": "#/components/schemas/BasicAuth", + "ACTIVE_DIRECTORY": "#/components/schemas/ActiveDirectoryAuth", + "AZURE_ACTIVE_DIRECTORY": "#/components/schemas/AzureActiveDirectoryAuth" + } + }, + "example": { + "type": "BASIC", + "username": "guest@example.com", + "password": "********" + } + } + } + }, + "AzureActiveDirectoryAuth": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AZURE_ACTIVE_DIRECTORY" + ] + }, + "providerName": { + "type": "string", + "description": "The Azure active directory provider name configured within NGINX Controller.\n" + } + }, + "required": [ + "type", + "providerName" + ] + }, + "ActiveDirectoryAuth": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ACTIVE_DIRECTORY" + ] + }, + "username": { + "type": "string", + "description": "The username for the NGINX Controller User account.\n" + }, + "password": { + "type": "string", + "description": "The password for the NGINX Controller User account.\n" + }, + "providerName": { + "type": "string", + "description": "The active directory provider name configured within NGINX Controller.\n" + } + }, + "required": [ + "type", + "username", + "password", + "providerName" + ] + }, + "BasicAuth": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "BASIC" + ] + }, + "username": { + "type": "string", + "description": "The username for the NGINX Controller User account.\n" + }, + "password": { + "type": "string", + "description": "The password for the NGINX Controller User account.\n" + } + }, + "required": [ + "type", + "username", + "password" + ] + }, + "ListReadyProviders": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimpleAuthProvider" + } + } + } + }, + "SimpleAuthProvider": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "BASIC", + "ACTIVE_DIRECTORY", + "AZURE_ACTIVE_DIRECTORY" + ] + } + } + }, + "Integration": { + "type": "object", + "description": "The Integration resource defines the account credentials and endpoint needed for NGINX Controller to connect to external services.\n", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/IntegrationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/IntegrationState" + } + } + }, + "GetIntegrationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Integration" + } + ] + }, + "ListIntegrationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "UpdateIntegration": { + "type": "object", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/UpdateIntegrationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/UpdateIntegrationState" + } + } + }, + "UpdateIntegrationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSIntegrationForUpdate" + }, + { + "$ref": "#/components/schemas/AzureIntegrationForUpdate" + }, + { + "$ref": "#/components/schemas/GenericIntegrationForUpdate" + }, + { + "$ref": "#/components/schemas/VSphereIntegrationForUpdate" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_INTEGRATION": "#/components/schemas/AWSIntegrationForUpdate", + "AZURE_INTEGRATION": "#/components/schemas/AzureIntegrationForUpdate", + "GENERIC_INTEGRATION": "#/components/schemas/GenericIntegrationForUpdate", + "VSPHERE_INTEGRATION": "#/components/schemas/VSphereIntegrationForUpdate" + } + } + }, + "AWSIntegrationForUpdate": { + "description": "The AWS integration stores the AWS access key for programmatic access to the AWS cloud API.\n", + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The AWS_INTEGRATION is an integration for connecting to Amazon Web Services (AWS).", + "enum": [ + "AWS_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string", + "description": "The URI of the AWS cloud service endpoint." + }, + "credential": { + "description": "Account credentials for AWS cloud API.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/AWSAccessKeyCredential" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_ACCESS_KEY": "#/components/schemas/AWSAccessKeyCredential" + } + } + } + } + }, + "AzureIntegrationForUpdate": { + "description": "The Azure integration stores the Azure credentials for programmatic access to the Azure cloud API.\n", + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The AZURE_INTEGRATION is an integration for connecting to Microsoft Azure.", + "enum": [ + "AZURE_INTEGRATION" + ] + }, + "credential": { + "description": "Account credentials for Azure cloud API.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureServicePrincipal" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AZURE_SERVICE_PRINCIPAL": "#/components/schemas/AzureServicePrincipal" + } + } + } + } + }, + "VSphereIntegrationForUpdate": { + "type": "object", + "description": "The VSphere integration stores the credentials for programmatic access to the VSphere cloud API.\n", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The VSPHERE_INTEGRATION is an Integration for connecting to the VSphere datacenter.\n", + "enum": [ + "VSPHERE_INTEGRATION" + ] + }, + "hostname": { + "type": "string", + "description": "VSphere instance hostname ( FQDN or IP ), Connection to it from the controller is through https, the VSphere server certificate is not verified." + }, + "rawCa": { + "type": "string", + "description": "Raw CA Certificate used to verify the vSphere server certificate", + "example": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserPassCredential" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "USER_PASS": "#/components/schemas/UserPassCredential" + } + } + } + } + }, + "GenericIntegrationForUpdate": { + "required": [ + "type" + ], + "type": "object", + "description": "A Generic integration stores the credentials and URI endpoint to connect to external services\nthat require a username and password or an API token for authentication, or accept an unauthenticated connection.\n", + "properties": { + "type": { + "type": "string", + "description": "The GENERIC_INTEGRATION is an integration for connecting to external services that require a\nusername and password or an API key, or accept an unauthenticated connection.\n", + "enum": [ + "GENERIC_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string", + "description": "The URI of the service endpoint." + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserPassCredential" + }, + { + "$ref": "#/components/schemas/ApiKeyCredential" + }, + { + "$ref": "#/components/schemas/Unauthenticated" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "USER_PASS": "#/components/schemas/UserPassCredential", + "API_KEY": "#/components/schemas/ApiKeyCredential", + "UNAUTHENTICATED": "#/components/schemas/Unauthenticated" + } + } + } + } + }, + "IntegrationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSIntegration" + }, + { + "$ref": "#/components/schemas/AzureIntegration" + }, + { + "$ref": "#/components/schemas/GenericIntegration" + }, + { + "$ref": "#/components/schemas/VSphereIntegration" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_INTEGRATION": "#/components/schemas/AWSIntegration", + "AZURE_INTEGRATION": "#/components/schemas/AzureIntegration", + "GENERIC_INTEGRATION": "#/components/schemas/GenericIntegration", + "VSPHERE_INTEGRATION": "#/components/schemas/VSphereIntegration" + } + } + }, + "AzureIntegration": { + "description": "The Azure integration stores the Azure credentials for programmatic access to the Azure cloud API.\n", + "required": [ + "type", + "credential" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The AZURE_INTEGRATION is an integration for connecting to Microsoft Azure.", + "enum": [ + "AZURE_INTEGRATION" + ] + }, + "credential": { + "description": "Account credentials for Azure cloud API.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureServicePrincipal" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AZURE_SERVICE_PRINCIPAL": "#/components/schemas/AzureServicePrincipal" + } + } + } + } + }, + "AWSIntegration": { + "description": "The AWS integration stores the AWS access key for programmatic access to the AWS cloud API.\n", + "required": [ + "type", + "credential" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The AWS_INTEGRATION is an integration for connecting to Amazon Web Services (AWS).", + "enum": [ + "AWS_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string", + "description": "The URI of the AWS cloud service endpoint." + }, + "credential": { + "description": "Account credentials for AWS cloud API.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/AWSAccessKeyCredential" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_ACCESS_KEY": "#/components/schemas/AWSAccessKeyCredential" + } + } + } + } + }, + "AWSAccessKeyCredential": { + "required": [ + "type", + "accessKeyID", + "secretAccessKey" + ], + "type": "object", + "description": "AWS access key credentials: access key ID and secret access key.\n", + "properties": { + "type": { + "type": "string", + "description": "AWS_ACCESS_KEY credentials are used to access the AWS API programmatically.\n", + "enum": [ + "AWS_ACCESS_KEY" + ] + }, + "accessKeyID": { + "type": "string", + "description": "The access key ID of the AWS access key credential." + }, + "secretAccessKey": { + "type": "string", + "description": "The secret access key of the AWS access key credential." + } + } + }, + "AzureServicePrincipal": { + "required": [ + "type", + "clientID", + "clientSecret", + "tenantID" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "", + "enum": [ + "AZURE_SERVICE_PRINCIPAL" + ] + }, + "clientID": { + "type": "string", + "description": "The Client ID of the service principal." + }, + "clientSecret": { + "type": "string", + "description": "The secret associated with the service principal." + }, + "tenantID": { + "type": "string", + "description": "The ID for the Active Directory tenant to which the service principal belongs." + } + } + }, + "VSphereIntegration": { + "type": "object", + "description": "The VSphere integration stores the credentials for programmatic access to the VSphere cloud API.\n", + "required": [ + "type", + "hostname", + "credential" + ], + "properties": { + "type": { + "type": "string", + "description": "The VSPHERE_INTEGRATION is an Integration for connecting to the VSphere cloud.\n", + "enum": [ + "VSPHERE_INTEGRATION" + ] + }, + "hostname": { + "type": "string", + "description": "VSphere instance hostname ( FQDN or IP ), Connection to it from the controller is through https, the VSphere server certificate is not verified." + }, + "rawCa": { + "type": "string", + "description": "Raw CA Certificate used to verify the vSphere server certificate", + "example": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserPassCredential" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "USER_PASS": "#/components/schemas/UserPassCredential" + } + } + } + } + }, + "GenericIntegration": { + "required": [ + "type", + "endpointUri", + "credential" + ], + "type": "object", + "description": "A Generic integration resource stores the credentials and URI endpoint to connect to external services\nthat require a username and password or API token for authentication, or accept unauthenticated connection.\n", + "properties": { + "type": { + "type": "string", + "description": "The GENERIC_INTEGRATION is an Integration for connecting to external services that require a\nusername and password or an API key, or accept an unauthenticated connection.\n", + "enum": [ + "GENERIC_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string", + "description": "The URI of the service endpoint." + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserPassCredential" + }, + { + "$ref": "#/components/schemas/ApiKeyCredential" + }, + { + "$ref": "#/components/schemas/Unauthenticated" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "USER_PASS": "#/components/schemas/UserPassCredential", + "API_KEY": "#/components/schemas/ApiKeyCredential", + "UNAUTHENTICATED": "#/components/schemas/Unauthenticated" + } + } + } + } + }, + "UserPassCredential": { + "description": "A credential consisting of a username and password. In the case of splunk HEC, username can be any string.", + "required": [ + "type", + "password", + "username" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "USER_PASS credentials are used to connect to web services that accept a username and password for authentication.\n", + "enum": [ + "USER_PASS" + ] + }, + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "ApiKeyCredential": { + "description": "For API key based authentication.", + "required": [ + "type", + "apiKey" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "API_KEY credentials are used to connect to web services that accept an API key for authentication.\n", + "enum": [ + "API_KEY" + ] + }, + "apiKey": { + "type": "string" + } + } + }, + "Unauthenticated": { + "description": "For unauthenticated connections.", + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Unauthenticated can be used for services that do not need authentication.\n", + "enum": [ + "UNAUTHENTICATED" + ] + } + } + }, + "GroupListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Group" + }, + "description": "Contains list of authentication groups.\n" + } + } + }, + "Group": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/GroupDef" + }, + "currentStatus": { + "$ref": "#/components/schemas/GroupDef" + } + } + }, + "GroupDef": { + "type": "object", + "required": [ + "roles" + ], + "description": "An authentication group (or \"AuthN Group\") is a collection of Roles. All AuthN Groups are globally unique. You can assign AuthN Groups to external authentication provider properties (such as an AD Group).\n", + "properties": { + "roles": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + } + }, + "examples": { + "AWSRequest": { + "value": { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ] + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY)" + } + } + } + }, + "AWSResponse": { + "value": { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "SplunkRequest": { + "value": { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ] + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "********" + } + } + } + }, + "SplunkResponse": { + "value": { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*********" + } + }, + "currentStatus": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*********" + } + } + } + }, + "AWSRequestForPatch": { + "value": { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ] + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "AWSResponseForPatch": { + "value": { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "SplunkRequestForPatch": { + "value": { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ] + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "********" + } + } + } + }, + "SplunkResponseForPatch": { + "value": { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*********" + } + }, + "currentStatus": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*********" + } + } + } + }, + "ListIntegrationResponse": { + "value": { + "items": [ + { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + }, + { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*****" + } + }, + "currentStatus": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*****" + } + } + } + ] + } + }, + "NotFoundError": { + "value": { + "code": 120003, + "message": "Error getting the Integration resource: the specified integration does not exist. Check the name of the Integration resource, then try again." + } + }, + "BadRequestError": { + "value": { + "code": 120004, + "message": "Error creating the Integration resource: could not parse the request payload. Check the format of the request, then try again." + } + }, + "AlreadyExistsError": { + "value": { + "code": 120007, + "message": "Error creating the Integration resource: the integration already exists. Use a unique name for the Integration resource, then try again." + } + } + } + } +} diff --git a/static/nginx-controller/api/ctlr-adc-openapi.json b/static/nginx-controller/api/ctlr-adc-openapi.json new file mode 100644 index 000000000..a33c146bd --- /dev/null +++ b/static/nginx-controller/api/ctlr-adc-openapi.json @@ -0,0 +1,13365 @@ +{ + "openapi": "3.0.3", + "info":{ + "title": "NGINX Controller Application Delivery REST API", + "version": "v1", + "description": "Use the NGINX Controller Application Delivery module to configure, secure, monitor, and troubleshoot load balancing for your applications." + }, + "servers": [ + { + "description": "NGINX Controller API", + "url": "https://{{CONTROLLER_FQDN}}/api/v1" + }], + "tags": [ + { + "name": "Instances", + "description": "Use the Instance API to manage NGINX Controller Instance resources." + }, + { + "name": "Instance Groups", + "description": "Use the Instance Groups API to manage a set of instances that can be used for scaling and high availability. The Instance Groups API is a beta feature and is not recommended for use in production environments." + }, + { + "name": "Instance Templates", + "description": "Use the Instance Templates API to manage templates that can be used to deploy new NGINX Plus instances." + }, + { + "name": "Locations", + "description": "Use the Locations API to manage the deployment locations for NGINX Controller." + }, + { + "name": "Integrations", + "description": "Use the Integrations API to manage integrated cloud provider accounts." + }, + { + "name": "Environments", + "description": "Use the Environments API to manage your Application Environments." + }, + { + "name": "Certs", + "description": "Use the Certs API to manage the certificates used to secure your App traffic." + }, + { + "name": "Gateways", + "description": "Use the Gateways API to manage Gateway resources." + }, + { + "name": "Apps", + "description": "Use the Apps API to manage App resources." + }, + { + "name": "Components", + "description": "Use the Components API to define child components (for example, microservices) for your Apps." + }, + { + "name": "API Definitions", + "description": "Use the API Definitions API to manage your APIs by using the NGINX Controller API Management module." + }, + { + "name": "DevPortals", + "description": "Use the DevPortals API to manage DevPortals resources." + }, + { + "name": "Identity Providers", + "description": "Use the Identity Provider API to manage Identity providers in the API-M Credential Management partition." + }, + { + "name": "Published APIs", + "description": "Use the Published APIs API to manage your APIs by using the API Management module." + }, + { + "name": "Error Sets", + "description": "Use the Error Sets API to view the default predefined Error Sets." + }, + { + "name": "Services", + "description": "Use the Services API to request a metadata list of a desired resource within a single environment or across all environments.\nSupported resources:\n - published-apis\n" + }, + { + "name": "Strategies", + "description": "Manage Security Strategies for your Apps and APIs. The current supported strategy is an NGINX App Protect Strategy (beta)." + }, + { + "name": "Policies", + "description": "Manage Security Policies for your Apps and APIs. The current supported policy is an NGINX App Protect Policy (beta)." + } + ], + "paths": { + "/infrastructure/instance-groups": { + "get": { + "tags": [ + "Instance Groups" + ], + "summary": "List Instance Groups", + "description": "Returns an unfiltered list of all Instance Group resources.", + "operationId": "listInstanceGroups", + "responses": { + "200": { + "description": "Successfully retieved a list of all the configured Instance Groups.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceGroupsResponse" + }, + "example": { + "value": { + "items": [ + { + "currentStatus": { + "instanceRefs": [], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "us-west-2 autoscale group", + "displayName": "aws-autoscale-group", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/amz-us-west-2-as-group" + }, + "name": "amz-us-west-2-as-group", + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Instance Groups" + ], + "summary": "Create an Instance Group", + "description": "Creates an new Instance Group resource.", + "operationId": "addInstanceGroup", + "requestBody": { + "description": "Defines the Instance Group resource to be added.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + }, + "example": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + } + } + } + }, + "responses": { + "202": { + "description": "The Instance Group resource has been accepted for creation. The Instance Group will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/instance-groups/{instanceGroupName}": { + "get": { + "tags": [ + "Instance Groups" + ], + "summary": "Get an Instance Group", + "description": "Returns information about a specified Instance Groupe resource.", + "operationId": "getInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Instance Group resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Instance Groups" + ], + "summary": "Upsert an Instance Group", + "description": "Creates a new Instance Group resource or updates an existing Instance Group resource.", + "operationId": "upsertInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + }, + "example": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "The Instance Group resource has been accepted for creation or update.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "delete": { + "tags": [ + "Instance Groups" + ], + "summary": "Delete an Instance Group", + "description": "Deletes the specified Instance Group resource.", + "operationId": "deleteInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Instance Group resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations": { + "get": { + "tags": [ + "Locations" + ], + "summary": "List all Locations", + "description": "Returns a list of all Locations.", + "operationId": "listLocations", + "responses": { + "200": { + "description": "Successfully retrieved a list of all of the configured Locations.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListLocationResponse" + }, + "example": { + "value": { + "items": [ + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "Location for instances where location has not been specified", + "displayName": "Unspecified (default)", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified" + }, + "name": "unspecified", + "tags": [ + "default" + ], + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Locations" + ], + "summary": "Create a Location", + "description": "Creates a new Location resource.", + "operationId": "addLocation", + "requestBody": { + "description": "Defines the Location resource to be added.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Location" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationRequest" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationRequest" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}": { + "get": { + "tags": [ + "Locations" + ], + "summary": "Get a Location", + "description": "Returns information about a specified Location resource.", + "operationId": "getLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Locations" + ], + "summary": "Upsert a Location", + "description": "Creates a new Location resource or updates an existing Location resource.", + "operationId": "upsertLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Location" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationRequest" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationRequest" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationRequest" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "201": { + "description": "Successfully updated the specified Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + } + } + }, + "delete": { + "tags": [ + "Locations" + ], + "summary": "Delete a Location", + "description": "Deletes the specified Location resource.", + "operationId": "deleteLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Location resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}/instances": { + "get": { + "tags": [ + "Instances" + ], + "summary": "List all Instances in a Location", + "description": "Returns the status and metadata for all of the Instances in the specified Location.", + "operationId": "listInstances", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully returned the status and metadata for all of the Instances in the specified Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceResponse" + }, + "examples": { + "INSTANCES": { + "$ref": "#/components/examples/ListInstanceResponse" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Instances" + ], + "summary": "Create an Instance", + "description": "Creates a new Instance resource.", + "operationId": "createInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + }, + "examples": { + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstanceRequest" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstanceRequest" + } + } + } + } + }, + "responses": { + "202": { + "description": "The Instance resource has been accepted for creation. The Instance will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + } + } + } + } + }, + "400": { + "description": "Bad input parameter or URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error creating the instance: could not parse the request payload. Check the format of the request, then try again.", + "code": 120647 + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing Instance resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error creating the instance: the instance already exists. Use a unique name for the instance, then try again.", + "code": 120652 + } + } + } + } + } + } + }, + "/infrastructure/locations/{locationName}/instances/{instanceName}": { + "get": { + "tags": [ + "Instances" + ], + "summary": "Get an Instance", + "description": "Returns the status and metadata for a single Instance.", + "operationId": "getInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "responses": { + "200": { + "description": "Successfully returned the details for an Instance.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/OtherInstance" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstance" + } + } + } + } + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error getting the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120603 + } + } + } + } + } + }, + "put": { + "tags": [ + "Instances" + ], + "summary": "Update an Instance", + "description": "Updates the description or display name of an existing Instance.", + "operationId": "updateInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the existing Instance.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/OtherInstance" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstance" + } + } + } + } + }, + "400": { + "description": "Bad input parameter or URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error updating the instance: could not parse the request payload. Check the format of the request, then try again.", + "code": 120612 + } + } + } + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error updating the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120614 + } + } + } + } + } + }, + "delete": { + "tags": [ + "Instances" + ], + "summary": "Delete an Instance", + "operationId": "deleteInstance", + "description": "Deletes the specified Instance.", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "responses": { + "202": { + "description": "Request for delete accepted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + } + } + } + }, + "204": { + "description": "Successfully deleted the Instance. No content is returned." + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error deleting the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120609 + } + } + } + }, + "409": { + "description": "Failed to delete the requested Instance resource.\n\nThe Instance is referenced by another resource. Remove the references to the Instance, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error deleting the instance: the NGINX instance is being configured. Try again later. If the problem persists, contact the system administrator.", + "code": 120640 + } + } + } + } + } + } + }, + "/infrastructure/locations/{locationName}/instance-templates": { + "get": { + "tags": [ + "Instance Templates" + ], + "summary": "List Instance Templates", + "description": "Returns an unfiltered list of all Instance Template resources in the specified Location.", + "operationId": "listInstanceTemplates", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved a list of all Instance Template resources for the specified Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceTemplateResponse" + }, + "examples": { + "INSTANCE_TEMPLATES": { + "$ref": "#/components/examples/AWSListResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Instance Templates" + ], + "summary": "Create an Instance Template", + "description": "Creates a new Instance Template resource.", + "operationId": "addInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "description": "Defines the Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceTemplate" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSRequest" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureRequestWithMarketplaceImageAndUsingExistingNic" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}/instance-templates/{instanceTemplateName}": { + "get": { + "tags": [ + "Instance Templates" + ], + "summary": "Get an Instance Template", + "description": "Gets information for the specified Instance Template resource.", + "operationId": "getInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Instance Templates" + ], + "summary": "Upsert an Instance Template", + "description": "Creates a new Instance Template resource or updates an existing Instance Template resource.", + "operationId": "upsertInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceTemplate" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSRequest" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureRequestWithCustomImageAndCreatingNewNicAndPublicIP" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully updated the specified Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "201": { + "description": "Successfully created the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + }, + "delete": { + "tags": [ + "Instance Templates" + ], + "summary": "Delete an Instance Template", + "description": "Deletes the specified Instance Template resource.", + "operationId": "deleteInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Instance Template resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/platform/integrations": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "List all Integrations", + "description": "Returns an unfiltered list of account Integrations.", + "operationId": "listIntegrations", + "responses": { + "200": { + "description": "Successfully retreived all Integration accounts.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListIntegrationResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Integrations" + ], + "summary": "Create an Integration account", + "description": "Creates a new Integration account.", + "operationId": "addIntegration", + "requestBody": { + "description": "Defines the Integration account to be added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing Integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/platform/integrations/{integrationName}": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get an Integration account", + "description": "Gets information about a specific Integration account.", + "operationId": "getIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "Integration not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Integrations" + ], + "summary": "Update an Integration account", + "description": "Updates an Integration account.", + "operationId": "updateIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "201": { + "description": "Successfully updated the specified Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Integrations" + ], + "summary": "Delete an Integration account", + "description": "Deletes the specified Integration account resource.", + "operationId": "deleteIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Integration resource." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/services/environments": { + "get": { + "tags": [ + "Environments" + ], + "summary": "List all Environments", + "description": "Returns a list of all Environment resources.\n", + "operationId": "listEnvironments", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Environment resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EnvironmentList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Environments" + ], + "summary": "Create an Environment", + "description": "Creates a new Environment resource.\n", + "operationId": "createEnvironment", + "requestBody": { + "description": "Defines the Environment resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "202": { + "description": "The Environment resource has been accepted for creation. The Environment will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/services/environments/{environmentName}": { + "get": { + "tags": [ + "Environments" + ], + "summary": "Get an Environment", + "description": "Returns information for the specified Environment.\n", + "operationId": "getEnvironment", + "responses": { + "200": { + "description": "Successfully returned information for the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Environments" + ], + "summary": "Upsert an Environment", + "description": "Creates a new Environment or updates an existing Environment resource.\n", + "operationId": "updateEnvironment", + "requestBody": { + "description": "Defines the Environment to create or the updates to make to an existing Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "201": { + "description": "Successfully created the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "202": { + "description": "The Environment resource has been accepted for creation or update. The Environment will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Environments" + ], + "summary": "Delete an Environment", + "description": "Deletes the specified Environment resource.", + "operationId": "deleteEnvironment", + "responses": { + "202": { + "description": "The Environment resource has been marked for deletion. The Environment will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Environment resource. No content returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the requested Environment resource.\n\nThe Environment contains references to other objects. Delete the referenced objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/certs": { + "get": { + "tags": [ + "Certs" + ], + "summary": "List all Certs", + "description": "Returns a list of Cert metadata objects for all of the Certs in the specified environment.", + "operationId": "listCerts", + "responses": { + "200": { + "description": "Successfully retrieved a list of Certs for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Certs" + ], + "summary": "Create a Cert", + "operationId": "createCert", + "description": "Creates a new Cert resource in the specified Environment.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cert" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/certs/{certName}": { + "get": { + "tags": [ + "Certs" + ], + "summary": "Get a Cert", + "operationId": "getCert", + "description": "Returns information for a specific Cert resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Cert.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Certs" + ], + "summary": "Upsert a Cert", + "operationId": "updateCert", + "description": "Creates a new Cert or updates an existing Cert resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cert" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Certs" + ], + "summary": "Delete a Cert", + "operationId": "deleteCert", + "description": "Deletes the specified Cert resource.", + "responses": { + "204": { + "description": "The specified Cert resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Cert resource failed.\nThe Cert is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "certName", + "description": "The name of the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/services/environments/{environmentName}/gateways": { + "get": { + "tags": [ + "Gateways" + ], + "summary": "List all Gateways", + "description": "Returns a list of all Gateways in the specified Environment.\n", + "operationId": "listGateways", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Gateways for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GatewayList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Gateways" + ], + "summary": "Create a Gateway", + "description": "Creates a new Gateway resource.\n", + "operationId": "createGateway", + "requestBody": { + "description": "Defines the Gateway resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "202": { + "description": "The Gateway resource has been accepted for creation. The Gateway will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to create a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Gateway resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/gateways/{gatewayName}": { + "get": { + "tags": [ + "Gateways" + ], + "summary": "Get a Gateway", + "description": "Returns information for the specified Gateway resource.\n", + "operationId": "getGateway", + "responses": { + "200": { + "description": "Successfully retrieved the requested Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Gateways" + ], + "summary": "Upsert a Gateway", + "description": "Creates a new Gateway or updates an existing Gateway resource.\n", + "operationId": "updateGateway", + "requestBody": { + "description": "Defines the Gateway resource to create or the updates to make to an existing Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "201": { + "description": "Successfully created the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "202": { + "description": "The Gateway resource has been accepted for creation or update. The Gateway will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Gateways" + ], + "summary": "Delete a Gateway", + "description": "Deletes the specified Gateway resource.", + "operationId": "deleteGateway", + "responses": { + "202": { + "description": "The Gateway resource has been marked for deletion. The Gateway will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Gateway resource. No content is returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete a Gateway resource failed.\nThe Gateway is referenced by an App Component(s) and cannot be deleted.\nDelete the App Component or remove the reference, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Gateway resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "gatewayName", + "description": "The name of the Gateway.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/GatewayName" + } + } + ] + }, + "/services/environments/{environmentName}/apps": { + "get": { + "tags": [ + "Apps" + ], + "summary": "List all Apps", + "description": "Returns a list of all App resources.\n", + "operationId": "listApps", + "responses": { + "200": { + "description": "Successfully retrieved a list of all App resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Create an App", + "description": "Creates a new App resource.", + "operationId": "createApp", + "requestBody": { + "description": "An App.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "202": { + "description": "The App resource has been accepted for creation. The App will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get an App", + "description": "Gets the information for a specific App resource.\n", + "operationId": "getApp", + "responses": { + "200": { + "description": "Successfully retrieved information for the requested App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Apps" + ], + "summary": "Upsert an App", + "description": "Creates a new App resource or updates an existing App resource.\n", + "operationId": "updateApp", + "requestBody": { + "description": "Defines the App resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "201": { + "description": "Successfully created the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "202": { + "description": "The App resource has been accepted for creation or update. The App will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Delete an App", + "description": "Deletes the specified App resource.\n\nYou must delete all of an App's child resources before you delete the App.\n", + "operationId": "deleteApp", + "responses": { + "202": { + "description": "The App resource has been marked for deletion. The App will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified App resource.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified App resource failed.\nThe App contains references to active objects and cannot be deleted. Delete the child objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/components": { + "get": { + "tags": [ + "Components" + ], + "summary": "List all Components", + "description": "Returns a list of all of the Component resources that are contained by the specified App.\n", + "operationId": "listAppComponents", + "responses": { + "200": { + "description": "Successfully retrieved a list of Component resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComponentList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + }, + "parameters": [ + { + "name": "strategyName", + "in": "query", + "description": "Filter desired component based on the strategy.", + "required": false, + "style": "form", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "policyName", + "in": "query", + "description": "Filter desired component based on the policy.", + "required": false, + "style": "form", + "explode": false, + "schema": { + "type": "string" + } + } + ] + }, + "post": { + "tags": [ + "Components" + ], + "summary": "Create a Component", + "description": "Creates a new Component resource.\n", + "operationId": "createAppComponent", + "requestBody": { + "description": "Defines the Component resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + }, + "examples": { + "ComponentRequest": { + "$ref": "#/components/examples/ComponentRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "202": { + "description": "The Component resource has been accepted for creation. The Component will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to create a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/components/{componentName}": { + "get": { + "tags": [ + "Components" + ], + "summary": "Get a Component", + "description": "Returns information for the specified Component.\n", + "operationId": "getAppComponent", + "responses": { + "200": { + "description": "Successfully returned the requested Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Components" + ], + "summary": "Upsert a Component", + "description": "Creates a new Component or updates an existing Component resource.\n", + "operationId": "updateAppComponent", + "requestBody": { + "description": "Defines the Component resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + }, + "examples": { + "ComponentRequest": { + "$ref": "#/components/examples/ComponentRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "201": { + "description": "Successfully created the specified Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "202": { + "description": "The Component resource has been accepted for creation or update. The Component will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Components" + ], + "summary": "Delete a Component", + "description": "Deletes the specified Component resource.", + "operationId": "deleteAppComponent", + "responses": { + "202": { + "description": "Component resource has been marked for deletion. The resource will be\ndeleted after the underlying resources have been freed.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Component. No content returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + }, + { + "name": "componentName", + "description": "The name of the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ComponentName" + } + } + ] + }, + "/services": { + "x-f5-experimental": true, + "get": { + "tags": [ + "Services" + ], + "summary": "List the metadata for all instances of the desired resource.", + "description": "Returns a metadata list of the requested resource. The resources that can be queried is currently restricted to published-apis.\n", + "operationId": "listResources", + "responses": { + "200": { + "description": "Successfully retrieved a metadata list of the requested resource.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceMeta" + } + } + } + } + }, + "400": { + "description": "The resource defined in the query parameters could not be found or is not yet supported. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The environment defined in the query parameters could not be found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "resource", + "in": "query", + "description": "Desired resource to list.", + "required": true, + "style": "form", + "explode": false, + "schema": { + "type": "string", + "enum": [ + "published-apis" + ] + } + }, + { + "name": "environment", + "in": "query", + "description": "Filter desired resource based on the environment.", + "required": false, + "style": "form", + "explode": false, + "schema": { + "type": "string" + } + } + ] + }, + "/services/api-definitions": { + "get": { + "tags": [ + "API Definitions" + ], + "summary": "List API Definitions", + "description": "Returns a list of API Definition resources.", + "operationId": "apiDefinitionsSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of all API Definitions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionList" + } + } + } + } + } + } + }, + "/services/api-definitions/{apiDefinitionName}": { + "get": { + "tags": [ + "API Definitions" + ], + "summary": "Get an API Definition", + "description": "Gets information about a specified API Definition.\n", + "operationId": "apiDefinitionsGet", + "responses": { + "200": { + "description": "Successfully returned the specified API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "404": { + "description": "The specified API Definition resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definitions" + ], + "summary": "Upsert an API Definition", + "description": "Creates a new API Definition or updates an existing API Definition resource.\n", + "operationId": "apiDefinitionsPut", + "requestBody": { + "description": "Defines the API Definition resource to create, or the updates to apply to an existing API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definitions" + ], + "summary": "Delete an API Definition", + "description": "Deletes the specified API Definition resource.", + "operationId": "apiDefinitionsDelete", + "responses": { + "204": { + "description": "Successfully deleted the requested API Definition resource. No content is returned.\n" + }, + "404": { + "description": "The specified API Definition resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition resource. Delete any referenced Published APIs or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions": { + "get": { + "tags": [ + "API Definition Versions" + ], + "summary": "List API Definition Versions", + "description": "Lists all Versions for the specified API Definition resource.\n", + "operationId": "definitionVersionsSearch", + "responses": { + "200": { + "description": "Successfully retrieved the list of API Definition Version resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "404": { + "description": "The specified API Definition resource was not found or does not contain any Versions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definition Versions" + ], + "summary": "Add an API Definition Version", + "description": "Creates a single new API Definition Version resource or multiple Version resources.\n", + "operationId": "definitionVersionsPutList", + "requestBody": { + "description": "Creates, updates, or deletes an API Definition Version resource. It interacts with a list of items.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully received the request to create the API Definition Version resource(s).", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition Version resource(s) as it has at least one dependent Published API. Delete the referenced Published API(s), then try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definition Versions" + ], + "summary": "Delete API Definition Versions", + "description": "Deletes all Versions for the specified API Definition resource.\n", + "operationId": "definitionVersionsDeleteList", + "responses": { + "204": { + "description": "Successfully deleted the Versions for the requested API Definition resource. No content is returned.\n" + }, + "404": { + "description": "The specified API Definition resource was not found or does not contain any Versions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the Versions for the specified API Definition resource. Delete or remove any references to Published APIs, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions/{version}": { + "get": { + "tags": [ + "API Definition Versions" + ], + "summary": "Get an API Definition Version", + "description": "Gets information about an API Definition Version resource.\n", + "operationId": "definitionVersionsGet", + "responses": { + "200": { + "description": "Successfully returned the specified API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "404": { + "description": "The specified API Definition Version resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definition Versions" + ], + "summary": "Upsert an API Definition Version", + "description": "Creates a single new Version resource or updates an existing API Definition Version resource.\n", + "operationId": "definitionVersionsPut", + "requestBody": { + "description": "Creates or updates an API Definition Version resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definition Versions" + ], + "summary": "Delete an API Definition Version", + "description": "Deletes an API Definition Version resource.\n", + "operationId": "definitionVersionsDelete", + "responses": { + "204": { + "description": "Successfully deleted the API Definition Version resource.\n" + }, + "404": { + "description": "The specified API Definition Version resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition resource. Delete or remove any references to Published APIs, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + }, + { + "$ref": "#/components/parameters/versionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions/{version}/import": { + "put": { + "tags": [ + "API Definition Version Import" + ], + "summary": "Import an API Definition Version", + "description": "Imports an API spec to the specified Version of an API Definition.\n\nUse this endpoint to import a raw API specification to define your API.\n\n- This endpoint accepts a valid OpenAPI 3 spec, formatted as valid JSON or YAML.\n- The file provided for import will be validated against the\n [OAS v3 schema](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.yaml).\n- You must specify a \"Content-Type\" header when importing an API spec.\n The endpoint accepts the following \"Content-Type\" values:\n\n - application/json\n - application/yaml\n - text/x-yaml\n - application/x-yaml\n - text/yaml\n", + "operationId": "definitionVersionsImport", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + }, + "application/yaml": { + "schema": { + "type": "string" + } + }, + "text/x-yaml": { + "schema": { + "type": "string" + } + }, + "application/x-yaml": { + "schema": { + "type": "string" + } + }, + "text/yaml": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully completed the API Version Import request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition Version resource from the spec provided.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "415": { + "description": "The request body contains an unsupported content type.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + }, + { + "$ref": "#/components/parameters/versionName" + } + ] + }, + "/security/identity-providers": { + "get": { + "tags": [ + "Identity Providers" + ], + "summary": "List Identity Providers", + "description": "Returns a list of all Identity Provider resources.\n\n> **Note:** These resources were known as Client Groups in pre-3.x versions of NGINX Controller.\n", + "operationId": "identityProvidersSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of Identity Provider resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/identity-providers/{identityProviderName}": { + "get": { + "tags": [ + "Identity Providers" + ], + "summary": "Get an Identity Provider", + "description": "Returns the specified Identity Provider resource.", + "operationId": "identityProvidersGet", + "responses": { + "200": { + "description": "Successfully returnd the specified Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "403": { + "description": "The request failed due to insufficient privileges.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Providers" + ], + "summary": "Upsert an Identity Provider", + "description": "Creates a new Identity Provider, or creates an existing Identity Provider resource.\n", + "operationId": "identityProvidersPut", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + }, + "examples": { + "IdentityProviderRequest": { + "$ref": "#/components/examples/IdentityProviderRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "201": { + "description": "Successfully created the requested Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create an Identity Provider resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Identity Providers" + ], + "summary": "Delete an Identity Provider", + "description": "Deletes the specified Identity Provider resource.", + "operationId": "identityProvidersDelete", + "responses": { + "202": { + "description": "The Identity Provider resource has been marked for deletion. The resource will be deleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Identity Provider resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete an Identity Provider resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + } + ] + }, + "/security/identity-providers/{identityProviderName}/clients": { + "get": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "List Identity Provider Clients", + "description": "Returns a list of all Identity Provider Client resources.\n", + "operationId": "identityProviderClientsSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of Identity Provider Client resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Create Multiple Identity Provider Clients", + "description": "Creates or updates multiple Identity Provider Client resources.\n", + "operationId": "identityProviderClientsPutList", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + }, + "examples": { + "IdentityProviderClientListRequest": { + "$ref": "#/components/examples/IdentityProviderClientListRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully upserted the Identity Provider Client resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider Client resources and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The Identity Provider Client resource conflicts with another resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + } + ] + }, + "/security/identity-providers/{identityProviderName}/clients/{identityProviderClientName}": { + "get": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Get an Identity Provider Client", + "description": "Returns information for the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsGet", + "responses": { + "200": { + "description": "Successfully returned the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Update an Identity Provider Client", + "description": "Updates the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsPut", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + }, + "examples": { + "IdentityProviderClientRequest": { + "$ref": "#/components/examples/IdentityProviderClientRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "201": { + "description": "Successfully created the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider Client resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Update an Identity Provider Client", + "description": "Updates the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsPatch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIdentityProviderClient" + }, + "examples": { + "IdentityProviderClientPatchMetadataRequest": { + "$ref": "#/components/examples/IdentityProviderClientPatchMetadataRequest" + }, + "IdentityProviderClientPatchDesiredStateRequest": { + "$ref": "#/components/examples/IdentityProviderClientPatchDesiredStateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "202": { + "description": "Successfully accepted the request to update an Identity Provider Client resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Delete an Identity Provider Client", + "description": "Deletes the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsDelete", + "responses": { + "202": { + "description": "Identity Provider Client resource has been marked for deletion. The resource will be\ndeleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Identity Provider Client resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + }, + { + "$ref": "#/components/parameters/identityProviderClientName" + } + ] + }, + "/services/environments/{environmentName}/devportals": { + "get": { + "tags": [ + "DevPortals" + ], + "summary": "List all DevPortals", + "description": "Returns a list of all DevPortal resources.\n", + "operationId": "ListDevPortals", + "responses": { + "200": { + "description": "Successfully retrieved a list of all DevPortals resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DevPortalsList" + } + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "DevPortals" + ], + "summary": "Create DevPortal", + "description": "Creates new Dev Portal resource.", + "operationId": "CreateDevPortal", + "requestBody": { + "description": "A Dev Portal.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created a specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "202": { + "description": "Dev Portal resource has been accepted for creation. A Dev Portal will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the DevPortal.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/devportals/{devPortalName}": { + "get": { + "tags": [ + "DevPortals" + ], + "summary": "Get Dev Portal", + "description": "Gets the information for a specific Dev Portal resource.\n", + "operationId": "GetDevPortal", + "responses": { + "200": { + "description": "Successfully retrieved information for the requested Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "DevPortals" + ], + "summary": "Upsert Dev Portal", + "description": "Creates a new Dev Portal resource or updates an existing Dev Portal resource.\n", + "operationId": "UpsertDevPortal", + "requestBody": { + "description": "Defines a Dev Portal resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "201": { + "description": "Successfully created the specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "202": { + "description": "The Dev Portal resource has been accepted for creation or update. Dev Portal will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "DevPortals" + ], + "summary": "Delete a DevPortal", + "description": "Deletes the specified Dev Portal resource.\nYou must delete all of a Dev Portal's child resources before you delete the Dev Portal.\n", + "operationId": "DeleteDevPortal", + "responses": { + "202": { + "description": "The DevPortal resource has been marked for deletion. DevPortal will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified DevPortal resource.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified App resource failed.\nThe App contains references to active objects and cannot be deleted. Delete the child objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the DevPortal.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "devPortalName", + "description": "The name of the DevPortal.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "/services/errorsets": { + "get": { + "tags": [ + "Error Sets" + ], + "summary": "List all Error Sets.", + "description": "Returns a list of all the Error Sets.", + "operationId": "listErrorSets", + "responses": { + "200": { + "description": "Successfully retrieved a list of Error Sets.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorSetList" + } + } + } + } + } + } + }, + "/services/errorsets/{errorSetName}": { + "get": { + "tags": [ + "ErrorSets" + ], + "summary": "Get an Error Set.", + "operationId": "getErrorSet", + "description": "Returns the information for a specific Error Set.", + "responses": { + "200": { + "description": "Successfully retrieved the requested Error Set.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorSet" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "errorSetName", + "description": "The name of the Error Set.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/published-apis": { + "get": { + "tags": [ + "Published APIs" + ], + "summary": "List Published APIs", + "description": "Returns a list of all Published APIs for the specified Environment and App.\n", + "operationId": "listPublishedAPIs", + "responses": { + "200": { + "description": "Successfully retrieved the list of Published APIs for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPIList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/environmentName" + }, + { + "$ref": "#/components/parameters/appName" + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/published-apis/{publishedApiName}": { + "get": { + "tags": [ + "Published APIs" + ], + "summary": "Get a Published API", + "description": "Gets information about the specified Published API.\n", + "operationId": "getPublishedAPI", + "responses": { + "200": { + "description": "Successfully retrieved the specified Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Published API resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Published APIs" + ], + "summary": "Upsert a Published API", + "description": "Creates a new Published API or updates an existing Published API resource.", + "operationId": "upsertPublishedAPI", + "requestBody": { + "description": "Defines the Published API to create, or the updates to apply to an existing Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "201": { + "description": "Successfully created the requested Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "202": { + "description": "The request to create a Published API succeeded. The resource will be created when the configuration is complete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Published APIs" + ], + "summary": "Delete a Published API", + "description": "Deletes the specified Published API resource.", + "operationId": "deletePublishedAPI", + "responses": { + "202": { + "description": "Published API has been marked for deletion. The resource will be\ndeleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Published API resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Published API resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/environmentName" + }, + { + "$ref": "#/components/parameters/appName" + }, + { + "$ref": "#/components/parameters/publishedApiName" + } + ] + }, + "/security/strategies": { + "get": { + "tags": [ + "Strategies" + ], + "summary": "List all Strategies", + "description": "Returns a list of Strategy metadata objects for all of the Strategies.", + "operationId": "StrategyServiceList", + "responses": { + "200": { + "description": "Successfully retrieved a list of Strategies.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Strategies" + ], + "summary": "Create a Strategy", + "operationId": "StrategyServicePost", + "description": "Creates a new Strategy resource.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Strategy" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Strategy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/strategies/{strategyName}": { + "get": { + "tags": [ + "Strategies" + ], + "summary": "Get a Strategy", + "operationId": "StrategyServiceGet", + "description": "Returns information for a specific Strategy resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Strategy.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Strategies" + ], + "summary": "Upsert a Strategy", + "operationId": "StrategyServicePut", + "description": "Creates a new Strategy or updates an existing Strategy resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Strategy" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Strategy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Strategy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Strategies" + ], + "summary": "Delete a Strategy", + "operationId": "StrategyServiceDelete", + "description": "Deletes the specified Strategy resource.", + "responses": { + "204": { + "description": "The specified Strategy resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Strategy resource failed.\nThe Strategy is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "strategyName", + "description": "The name of the Strategy.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/security/policies": { + "get": { + "tags": [ + "Policies" + ], + "summary": "List all Policies", + "description": "Returns a list of Policy metadata objects for all of the Policies.", + "operationId": "listPolicies", + "responses": { + "200": { + "description": "Successfully retrieved a list of Policies.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Policies" + ], + "summary": "Create a Policy", + "operationId": "createPolicy", + "description": "Creates a new Policy resource.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/policies/{policyName}": { + "get": { + "tags": [ + "Policies" + ], + "summary": "Get a Policy", + "operationId": "getPolicy", + "description": "Returns information for a specific Policy resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Policy.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Policies" + ], + "summary": "Upsert a Policy", + "operationId": "updatePolicy", + "description": "Creates a new Policy or updates an existing Policy resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Policies" + ], + "summary": "Delete a Policy", + "operationId": "deletePolicy", + "description": "Deletes the specified Policy resource.", + "responses": { + "204": { + "description": "The specified Policy resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Policy resource failed.\nThe Policy is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "policyName", + "description": "The name of the Policy.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + } + }, + "components": { + "parameters": { + "environmentName": { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + "appName": { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + }, + "apiDefinitionName": { + "name": "apiDefinitionName", + "in": "path", + "description": "The name of the API Definition resource.", + "required": true, + "style": "simple", + "explode": false, + "example": "shopping-app-api-def", + "schema": { + "type": "string" + } + }, + "publishedApiName": { + "name": "publishedApiName", + "in": "path", + "description": "The name of the Published API resource.", + "required": true, + "style": "simple", + "explode": false, + "example": "shopping-app-api-staging", + "schema": { + "type": "string" + } + }, + "versionName": { + "name": "version", + "in": "path", + "description": "The Version of the API Definition.", + "required": true, + "style": "simple", + "explode": false, + "example": "v1_2fd4e1c6", + "schema": { + "type": "string" + } + }, + "LocationName": { + "name": "locationName", + "in": "path", + "description": "The name of the Location that contains the Instance.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceName": { + "name": "instanceName", + "in": "path", + "description": "The name of the Instance.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceGroupName": { + "name": "instanceGroupName", + "in": "path", + "description": "The name of the Instance Group.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceTemplateName": { + "name": "instanceTemplateName", + "in": "path", + "description": "The name of the Instance Template resource.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "identityProviderName": { + "name": "identityProviderName", + "in": "path", + "description": "The name of the Identity Provider.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "identityProviderClientName": { + "name": "identityProviderClientName", + "in": "path", + "description": "The name of the Identity Provider Client.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "IntegrationName": { + "name": "integrationName", + "in": "path", + "description": "The name of the Integration resource.", + "required": true, + "schema": { + "type": "string" + } + } + }, + "schemas": { + "ResourceName": { + "type": "string", + "description": "The name of a resource.", + "example": "production" + }, + "LocationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherLocation" + }, + { + "$ref": "#/components/schemas/AWSLocation" + }, + { + "$ref": "#/components/schemas/AzureLocation" + }, + { + "$ref": "#/components/schemas/VSphereLocation" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_LOCATION": "#/components/schemas/OtherLocation", + "AWS_LOCATION": "#/components/schemas/AWSLocation", + "AZURE_LOCATION": "#/components/schemas/AzureLocation", + "VSPHERE_LOCATION": "#/components/schemas/VSphereLocation" + } + } + }, + "OtherLocation": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type. Select the environment where you want to create the location. \nTo create a location that’s not specific to any cloud environment, select OTHER_LOCATION.\n", + "enum": [ + "OTHER_LOCATION" + ] + } + } + }, + "AWSLocation": { + "type": "object", + "required": [ + "vpcID", + "region", + "integrationRef", + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type. Select the environment where you want to create the location. \nTo create a location that’s specific to the AWS cloud environment, select AWS_LOCATION.\n", + "enum": [ + "AWS_LOCATION" + ] + }, + "region": { + "description": "The AWS region.\n", + "type": "string" + }, + "vpcID": { + "type": "string", + "description": "The vpcID of the AWS Virtual Private Cloud (VPC) where new Instances created under this location should reside.\nThe VPC must be in the specified AWS region.\n" + }, + "integrationRef": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "AzureLocation": { + "type": "object", + "required": [ + "type", + "region", + "resourceGroup", + "subscriptionID", + "integrationRef" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type.", + "enum": [ + "AZURE_LOCATION" + ] + }, + "region": { + "description": "The Azure region.", + "type": "string" + }, + "resourceGroup": { + "type": "string", + "description": "The name of the resourceGroup." + }, + "subscriptionID": { + "type": "string", + "description": "The unique alphanumeric string that identifies the Azure subscription." + }, + "integrationRef": { + "description": "Integration ref.", + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "VSphereLocation": { + "type": "object", + "required": [ + "type", + "datacenter", + "integrationRef" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type.", + "enum": [ + "VSPHERE_LOCATION" + ] + }, + "datacenter": { + "description": "A VSphere data center.", + "type": "string" + }, + "folder": { + "type": "string", + "description": "The name of the VM folder that you want to add your instance to. If no name is provided, the instance will be created in the folder containing the VM template your instance is cloned from." + }, + "integrationRef": { + "description": "Integration ref.", + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "Location": { + "required": [ + "metadata", + "desiredState" + ], + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/LocationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/LocationState" + } + } + }, + "GetLocationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Location" + } + ] + }, + "ListLocationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Location" + } + } + } + }, + "AppList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "App": { + "type": "object", + "description": "An App is a collection of Components.", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "x-f5-experimental": true, + "type": "object" + }, + "currentStatus": { + "$ref": "#/components/schemas/AppCurrentStatus" + } + } + }, + "AppCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "componentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "Component": { + "description": "A component represents the processing –- reverse proxying, rate limiting, security policy enforcement, header rewrites, etc.\n–- of traffic associated with a logical part (for example, microservice) of an application/API. It also defines the subsequent\nload balancing of traffic to workloads implementing that part of the application/API.\n\nA component can be either a web or a TCP/UDP component –- indicated by the component type. Web components are used to\nconfigure NGINX functionality associated with HTTP/HTTPS protocols and inherit web and common settings from linked Gateways.\nTCP/UDP components are used to configure NGINX functionality associated with TCP/UDP protocols\nand inherit TCP/UDP and common settings from linked Gateways.\n", + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/ComponentDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/ComponentCurrentStatus" + } + } + }, + "ComponentName": { + "type": "string" + }, + "ComponentList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "WorkloadGroupSnippet": { + "description": "The NGINX directives to apply to the upstream blocks generated by the workload groups\nin the backend. Directives are applied to all workload groups by default. Use\napplicableWorkloadGroups to apply directives only to specific workload groups.\n", + "allOf": [ + { + "type": "object", + "properties": { + "applicableWorkloadGroups": { + "type": "array", + "description": "Workload group name.", + "items": { + "type": "string" + } + } + } + }, + { + "$ref": "#/components/schemas/NginxConfig" + } + ] + }, + "ComponentConfigSnippets": { + "type": "object", + "description": "The NGINX config snippets to insert into the server and location blocks\ngenerated by the component URIs.\n\n**Caution**: When you use snippets to customize your NGINX configuration, your changes are\napplied to the nginx.conf file *as is*. NGINX Controller does not verify that your configuration\nis valid before applying the snippet.\n\nWe strongly recommend verifying snippets in a lab environment before making any changes\nin production.\n", + "properties": { + "uriSnippets": { + "description": "An array of URI snippets.\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/UriSnippet" + } + }, + "workloadGroupSnippets": { + "description": "An array of workload group snippets.\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkloadGroupSnippet" + } + } + } + }, + "ComponentStateCommon": { + "type": "object", + "description": "Settings common to Web & TCP/UDP Components.", + "properties": { + "configSnippets": { + "$ref": "#/components/schemas/ComponentConfigSnippets" + } + } + }, + "ComponentCurrentStatus": { + "description": "The current snapshot of the component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this Component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/ComponentWebCurrentStatus" + }, + { + "$ref": "#/components/schemas/ComponentTcpUdpCurrentStatus" + } + ] + }, + "ComponentWebCurrentStatus": { + "description": "The current snapshot of the web component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "properties": { + "componentType": { + "description": "Defines what type of Component this is.", + "type": "string", + "enum": [ + "WEB" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentWebIngress" + }, + "backend": { + "$ref": "#/components/schemas/WebBackend" + }, + "programmability": { + "$ref": "#/components/schemas/Programmability" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "security": { + "$ref": "#/components/schemas/Security" + }, + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + }, + "caching": { + "$ref": "#/components/schemas/Caching" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "ComponentTcpUdpCurrentStatus": { + "description": "The current snapshot of the TCP/UDP component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "properties": { + "componentType": { + "description": "Defines what type of Component this is.", + "type": "string", + "enum": [ + "TCPUDP" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentTcpUdpIngress" + }, + "backend": { + "$ref": "#/components/schemas/TcpUdpBackend" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "GatewayName": { + "type": "string" + }, + "GatewayList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "GatewayCurrentStatus": { + "description": "The current snapshot of the gateway settings that are reflected in the configuration on NGINX instances referenced by this Gateway.\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayWebState" + }, + { + "$ref": "#/components/schemas/GatewayStateCommon" + }, + { + "type": "object", + "properties": { + "ingress": { + "$ref": "#/components/schemas/GatewayIngress" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "Gateway": { + "type": "object", + "description": "A Gateway represents the initial network entry point of application and/or API traffic into an NGINX instance that is\nin the data path of this traffic. Gateway settings are combined with Component settings that reference the Gateway;\nthe resulting composite config is sent to the NGINX instances that the Gateway references.\n\nA Gateway can be referenced by either web components and/or TCP/UDP components. Web-only settings in the Gateway (for example, web URIs)\napply only to web components. TCP/UDP-only settings in the Gateway (for example, TCP/UDP URIs) apply only to TCP/UDP components.\nWeb and TCP/UDP common settings in the Gateway (for example, global TLS, socket) apply to both web and TCP/UDP components.\n\nExamples:\nGateway with web and TCP/UDP URIs, web-specific settings, common settings. Web URIs and web settings apply to web components.\nCommon settings apply to both component types. TCP/UDP URIs apply only to TCP/UDP components –- presently, there are no other TCP/UDP only settings.\n\nGateway web URIs (for example, https://www.xyz.com) combined with web component URIs (for example, /blog) define web URI config (https://www.xyz.com/blog).\nComponent TCP/UDP URIs define TCP/UDP URI config (for example, tcp+tls://192.168.1.1:200); Gateway TCP/UDP URIs can provide TLS info plus restrict\nwhich TCP/UDP URIs can be in the component. Alternatively, component URIs fully define the URI config if the Gateway has no URIs.\n\nIf only a single URI type is in the Gateway, the URI config for that type is determined by combining the Gateway URIs with\nthe URIs from components of that type; only component URIs are used for the URI config for the other type.\n\nFor HTTPS URIs, global Gateway TLS settings are used when more specific TLS info is not present in the Gateway URIs,\nor for component URIs that have an HTTPS protocol and hostnames with no specific URI or component global TLS settings defined.\n\nFor tcp+tls URIs, Gateway TLS settings are used when TLS info is not defined in a component URI or component global TLS.\nA Gateway URI’s TLS info is used if it encompasses the component URI. For example, tcp+tls://192.168.1.5:100-104 in the Gateway and\ncomponent URI of tcp+tls://192.168.1.5:100. Global Gateway TLS is used if no other TLS settings apply.\n", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/GatewayDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/GatewayCurrentStatus" + } + } + }, + "GZip": { + "properties": { + "isEnabled": { + "type": "boolean", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip" + } + }, + "buffers": { + "type": "object", + "properties": { + "number": { + "type": "integer" + }, + "size": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + } + }, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_buffers" + } + }, + "level": { + "type": "integer", + "minimum": 1, + "maximum": 9, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_comp_level" + } + }, + "disabledUserAgents": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_disable" + } + }, + "httpVersion": { + "type": "string", + "pattern": "^[1-3]{1}\\.[0-1]{1}$", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version" + } + }, + "minLength": { + "type": "integer", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_min_length" + } + }, + "proxied": { + "type": "string", + "enum": [ + "DISABLED", + "EXPIRED", + "NOCACHE", + "NOSTORE", + "PRIVATE", + "NOLASTMODIFIED", + "NOETAG", + "AUTH", + "ANY" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied" + } + }, + "mimeTypes": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_types" + } + }, + "vary": { + "type": "string", + "enum": [ + "DISABLED", + "ENABLED" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_vary" + } + }, + "static": { + "type": "string", + "enum": [ + "DISABLED", + "ENABLED", + "ALWAYS" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html#gzip_static" + } + } + } + }, + "Compression": { + "description": "Gzip compression settings.", + "type": "object", + "properties": { + "gzip": { + "$ref": "#/components/schemas/GZip" + } + } + }, + "GatewayWebState": { + "description": "Non-ingress settings in a Gateway that apply only to Web Components.", + "type": "object", + "properties": { + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + } + } + }, + "NginxDirective": { + "required": [ + "directive" + ], + "properties": { + "directive": { + "type": "string", + "description": "The name of the NGINX directive. For a list of NGINX Directives, refer to [the NGINX documentation](http://nginx.org/en/docs/dirindex.html).\n" + }, + "args": { + "type": "array", + "description": "Directive arguments.", + "items": { + "type": "string" + } + }, + "block": { + "type": "array", + "description": "The directives to include within a block directive or context.", + "items": { + "$ref": "#/components/schemas/NginxDirective" + } + } + } + }, + "NginxConfig": { + "type": "object", + "required": [ + "directives" + ], + "properties": { + "directives": { + "type": "array", + "description": "List of NGINX directives to add to the configuration.\n", + "items": { + "$ref": "#/components/schemas/NginxDirective" + } + } + } + }, + "URIMatchMethod": { + "description": "Specifies how to determine a match between an incoming Web URI and configured Web URI.", + "type": "string", + "enum": [ + "PREFIX", + "REGEX", + "REGEX_CASE_SENSITIVE", + "SUFFIX", + "EXACT" + ], + "default": "PREFIX" + }, + "ApplicableUri": { + "type": "object", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string" + }, + "matchMethod": { + "$ref": "#/components/schemas/URIMatchMethod" + } + } + }, + "ApplicableUris": { + "type": "array", + "description": "Defines an array of ingress URIs with a corresponding matchMethod that this rule/snippet applies to.\nBy default, a rule/snippet applies to all ingress URIs in the gateway/component. A snippet can be\napplied only to URIs of the gateway/component that it is in. A snippet in a component cannot be\napplied to the gateway URI. However, a rule can be applied at a gateway level by specifying ingress\nURIs from the gateway, for example, \"http://www.nginx.com\". Note that applying the rule to URIs at\na gateway level can affect other components. The URI and the matchMethod must match an ingress URI defined\neither at the component or gateway level. If no match is found, the request is rejected.\n", + "items": { + "$ref": "#/components/schemas/ApplicableUri" + } + }, + "UriSnippet": { + "description": "The NGINX directives to apply to the server and location blocks generated by the URIs.\nDirectives are applied to all URIs by default. Use applicableURIs to apply directives\nonly to specific URIs.\n", + "allOf": [ + { + "type": "object", + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + { + "$ref": "#/components/schemas/NginxConfig" + } + ] + }, + "DiskStore": { + "type": "object", + "required": [ + "path", + "maxSize", + "minFree", + "inMemoryStoreSize" + ], + "properties": { + "path": { + "description": "Defines what the path is for this storage", + "example": "/tmp/hdd1", + "type": "string", + "minLength": 1 + }, + "isDefault": { + "description": "When more than one disk stores are specified, the data stored in the cache is split by percentage or string.\n`isDefault` specifies a default storage for cache data that does not meet the percent or string criteria.\n", + "type": "boolean", + "default": false + }, + "percentCriteria": { + "description": "Defines the percentage that should be allocated to this store. This must be specified when `criteriaType` is PERCENTAGE.", + "type": "string", + "example": "75%", + "pattern": "\\d+(?:\\.\\d+)?%" + }, + "stringCriteria": { + "description": "Defines string pattern of data that should go in to this store. This must be specified when `criteriaType` is STRING", + "type": "array", + "items": { + "description": "Depending on the 'SplitConfig' \"Key\", string could have different patterns.\nLike ~.mp3$ for REGEX match or any string like 'hostname.*' or IP address\n", + "type": "string", + "minLength": 1, + "example": "[\"~.mp3$\", \"~*.avi\"],[\"10.1.1.1\", \"10.1.1.2\"]" + } + }, + "maxSize": { + "type": "string", + "description": "Defines the maximum size that the cache can grow to", + "example": "5G", + "pattern": "^[0-9]+[kKmMgG]?$" + }, + "minFree": { + "type": "string", + "description": "Defines the minimum amount of free disk space on the drive for the cache. If the free disk space drops below the minimum value, the cache is trimmed.", + "example": "10k", + "pattern": "^[0-9]+[kKmMgG]?$" + }, + "inMemoryStoreSize": { + "type": "string", + "description": "Defines the size of the memory zone where information about the data is stored.", + "example": "500m", + "pattern": "^[0-9]+[kKmM]?$" + }, + "trimPolicy": { + "description": "Defines how we configure `manager_files` for the proxy_cache_path\nCache management is performed in iterations. During one iteration no more than `maxFiles` items are deleted\nThis policy defines how many files are deleted, how often and how long the process lasts.\n", + "type": "object", + "properties": { + "maxFiles": { + "type": "integer", + "description": "Defines how many files are deleted in one iteration. NGINX defaults this to 100", + "minimum": 1 + }, + "frequency": { + "type": "string", + "description": "Defines the length of the pause between cache management iterations. The default for NGINX is 50 milliseconds.", + "example": "2s", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + }, + "durationThreshold": { + "type": "string", + "description": "Defines the duration for one cache management iteration. The default for NGINX is 200 milliseconds.", + "example": "2s", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + } + } + }, + "loaderPolicy": { + "description": "Defines how `loader_files` are configured for the `proxy_cache_path`.\nloading is done in iterations. During one iteration no more than maxFiles items are loaded\nDefines how previosly cached data is loadded in the cache `Zone`.\n", + "type": "object", + "properties": { + "maxFiles": { + "type": "integer", + "description": "During one iteration no more than `files` items are loaded. NGINX defaults this to 100", + "minimum": 1 + }, + "frequency": { + "type": "string", + "description": "Defines the length of the pause between cache management iterations. For NGINX, the default is 50 milliseconds.", + "example": "2s", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + }, + "durationThreshold": { + "type": "string", + "description": "Defines the maximum duration for one cache management iteration. For NGINX, the default is 200 milliseconds.", + "example": "2s", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + } + } + }, + "purgerPolicy": { + "description": "Defines how we configure `purger` for the proxy_cache_path\nPurger is done in iterations. During one iteration no more than maxFiles items are scanned\nSpecifies whether cache entires matching a wildcard key are removed from the disk by the cache purger.\n", + "type": "object", + "properties": { + "maxFiles": { + "type": "integer", + "description": "Defines the number of items to scan during one iteration. For NGINX, default is 10 items.", + "minimum": 1 + }, + "frequency": { + "type": "string", + "description": "Defines the length of the pause between cache purge iterations. For NGINX, the default is 50 milliseconds.", + "example": "10ms", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + }, + "durationThreshold": { + "type": "string", + "description": "Defines the maximum duration for one cache purge iteration. For NGINX, the default is 50 milliseconds.", + "example": "10ms", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + } + } + }, + "directoryLevel": { + "type": "object", + "description": "Defines the level of the directory structure that NGINX creates for the cache.\nDefines the cache hierarchy levels from 1 to 3, with each level accepting a value of `1` or `2`.\nFor example, `levels=1:2` file names in a cache will look like this. (**Note**: `/c/29` & `29c` at end)\n/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c\n", + "properties": { + "first": { + "type": "integer", + "minimum": 1, + "maximum": 2 + }, + "mid": { + "type": "integer", + "minimum": 1, + "maximum": 2 + }, + "last": { + "type": "integer", + "minimum": 1, + "maximum": 2 + } + } + }, + "tempPath": { + "description": "Determines whether you'll use a temporary path for the cache disk store.\nYou can define the path location by using `proxy_temp_path` in a `configSnippet` for the Component.\n", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ] + }, + "inactiveTime": { + "description": "Defines the length of time to wait before removing cached data that haven't been accessed.", + "example": "5s", + "type": "string", + "pattern": "^[0-9]+[h|hm|hms|ms|m|s]{1,2}$" + } + } + }, + "Caching": { + "description": "Cache settings for components applicable to web client requests.", + "type": "object", + "required": [ + "diskStores" + ], + "properties": { + "splitConfig": { + "description": "Allows the cache to be split among multiple storage devices", + "type": "object", + "required": [ + "criteriaType" + ], + "properties": { + "key": { + "type": "string", + "description": "Defines the variable on which the cache is split across different storage devices.", + "example": "${remote_addr}${http_user_agent}${date_gmt}", + "minLength": 1 + }, + "criteriaType": { + "type": "string", + "description": "Defines the criteria on which the cache is split across different storage devices.", + "enum": [ + "PERCENTAGE", + "STRING" + ], + "default": "PERCENTAGE" + } + } + }, + "diskStores": { + "description": "Defines an array of disk stores. If more than one is specified, the cache contents are split between the stores using splitConfig settings.\nIf criteriaType is PERCENTAGE, then percentCriteria should be specified to control how much goes in to a particular store.\nIf the criteriaType is STRING, then stringCriteria should be specified to control the split based on a pattern match.\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/DiskStore" + } + } + } + }, + "ComponentWebDesiredState": { + "description": "The desired settings in the Web Component that the user wants in the configuration on NGINX instances associated with\nthe Gateways which this component references.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "required": [ + "ingress", + "backend" + ], + "properties": { + "componentType": { + "description": "Defines the Component type. The default type is Web.", + "type": "string", + "enum": [ + "WEB" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentWebIngress" + }, + "backend": { + "$ref": "#/components/schemas/WebBackend" + }, + "programmability": { + "$ref": "#/components/schemas/Programmability" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "security": { + "$ref": "#/components/schemas/Security" + }, + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + }, + "caching": { + "$ref": "#/components/schemas/Caching" + } + } + } + ] + }, + "ComponentTcpUdpIngress": { + "description": "Ingress settings in a TCP/UDP Component.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentIngressCommon" + } + ] + }, + "TcpUdpMonitoring": { + "description": "Health monitor settings across all workload groups in a TCP/UDP Component.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitoringCommon" + }, + { + "type": "object", + "properties": { + "send": { + "description": "Probe request for a TCP/UDP monitor.", + "type": "string" + }, + "response": { + "description": "Case-sensitive regular expression for the expected success response to a TCP/UDP monitor.", + "type": "string" + } + } + } + ] + }, + "TcpUdpProxy": { + "description": "Proxy retry and timeout settings applicable to servers in a TcpUdp workloadGroup associated with a Component.", + "type": "object", + "properties": { + "nextUpstream": { + "description": "When a connection to the proxied server cannot be established, determines whether a client connection will be passed to the next server.", + "type": "string", + "enum": [ + "ON", + "OFF" + ], + "default": "OFF" + }, + "connectTimeout": { + "description": "Defines a timeout for establishing a connection with the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + }, + "proxyTimeout": { + "description": "Sets the timeout between two successive read or write operations on client or proxied server connections.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + } + } + }, + "TcpUdpWorkloadGroup": { + "description": "Group of servers hosting a part of a TCP/UDP application represented by a Component.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkloadGroupCommon" + }, + { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/components/schemas/TcpUdpProxy" + }, + "useServerPort": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "uris": { + "type": "object", + "description": "The URI of a server that hosts a TCP/UDP application.\n\nThe URI must conform to the format `schema://address:port`.\n\n- The schema must be one of the following: `tcp`, `udp`, or `tcp+tls`.\n- The address value can be an IP address or a host name.\n- All three elements -- schema, address, and port -- are required.\n\nNote: When `useServerPort` is `ENABLED`, then you should define a single URI that uses the `schema://address` format.\nDefining a `port` value for the URI when also using `useServerPort` will result in an error.\n\nFor example:\n\n- `tcp://192.0.2.247:8443`\n- `tcp+tls://192.0.2.247:8449`\n- `udp://www.f5workload.com:989`\n", + "additionalProperties": { + "$ref": "#/components/schemas/WorkloadUri" + } + } + } + } + ] + }, + "TcpUdpBackend": { + "description": "Backend settings in a TCP/UDP Component.\n", + "type": "object", + "properties": { + "monitoring": { + "$ref": "#/components/schemas/TcpUdpMonitoring" + }, + "workloadGroups": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TcpUdpWorkloadGroup" + } + } + } + }, + "ComponentTcpUdpDesiredState": { + "description": "The desired settings in the TCP/UDP Component to use in the configuration on NGINX instances associated with the Gateways that this Component references.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "required": [ + "componentType", + "ingress", + "backend" + ], + "properties": { + "componentType": { + "description": "Defines what type of Component this is. The type must be TCPUDP.", + "type": "string", + "enum": [ + "TCPUDP" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentTcpUdpIngress" + }, + "backend": { + "$ref": "#/components/schemas/TcpUdpBackend" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + } + } + } + ] + }, + "ComponentDesiredState": { + "description": "The desired component settings to use in the NGINX instance configuration that's associated with\nthe Gateways that this component references.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/ComponentWebDesiredState" + }, + { + "$ref": "#/components/schemas/ComponentTcpUdpDesiredState" + } + ] + }, + "GatewayConfigSnippets": { + "type": "object", + "description": "The NGINX config snippets to insert into the NGINX config generated by the gateway.\nNote that the default directives and directives generated by the native parts of the\nAPI(API sections other than configSnippets) cannot be overriden.\nmainSnippet - Insert directives in the main context.\nhttpSnippet - Insert directives in the http context.\nstreamSnippet - Insert directives in the stream context.\nuriSnippet - Insert into server blocks generated by the gateway URIs.\n This applies only to HTTP URIs, since TCP and UDP URIs do not\n generate server blocks.\n\n**Caution**: When you use snippets to customize your NGINX configuration, your changes are\napplied to the nginx.conf file *as is*. NGINX Controller does not verify that your configuration\nis valid before applying the snippet.\n\nWe strongly recommend verifying snippets in a lab environment before making any changes\nin production.\n", + "properties": { + "mainSnippet": { + "$ref": "#/components/schemas/NginxConfig" + }, + "httpSnippet": { + "$ref": "#/components/schemas/NginxConfig" + }, + "streamSnippet": { + "$ref": "#/components/schemas/NginxConfig" + }, + "uriSnippets": { + "description": "An array of URI snippets.\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/UriSnippet" + } + } + } + }, + "HA": { + "description": "Data path high availability settings", + "type": "object", + "properties": { + "isEnabled": { + "type": "boolean", + "description": "Enables or disables HA.\n\nWhen set to `true`, supports configuring instances in an active‑passive, high‑availability (HA) setup.\n\nTo configure the gateway on HA mode:\n - `keepalived` must be installed and configured on the desired instances.\n - At least one listen IP address must be specified in the `listenIps` section within `InstanceRefs`\n\n See the `listenIps` section for additional requirements for configuring HA.\n" + } + } + }, + "GatewayStateCommon": { + "description": "Non-ingress settings in a Gateway that apply to Web and TCP/UDP Components.", + "type": "object", + "properties": { + "configSnippets": { + "$ref": "#/components/schemas/GatewayConfigSnippets" + }, + "ha": { + "$ref": "#/components/schemas/HA" + } + } + }, + "ServiceConfigState": { + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "default": "DISABLED" + }, + "GatewaySocketSettings": { + "description": "Socket settings in a Gateway.", + "type": "object", + "properties": { + "setFib": { + "x-f5-experimental": true, + "type": "integer" + }, + "fastOpen": { + "x-f5-experimental": true, + "type": "integer" + }, + "acceptFilter": { + "x-f5-experimental": true, + "type": "string", + "enum": [ + "DATA_READY", + "HTTP_READY" + ] + }, + "deferred": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "backlog": { + "x-f5-experimental": true, + "type": "integer", + "default": -1 + }, + "isIpv6Only": { + "x-f5-experimental": true, + "type": "boolean", + "default": false + }, + "reusePort": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "tcpKeepAlive": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "idle": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "interval": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "count": { + "type": "integer" + } + } + }, + "receiveBufferSize": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + }, + "sendBufferSize": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + } + } + }, + "TLS": { + "description": "TLS settings applicable to URIs.", + "type": "object", + "required": [ + "certRef" + ], + "properties": { + "certRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "protocols": { + "type": "array", + "items": { + "type": "string", + "pattern": "TLSv1|TLSv1\\.[1-3]|SSLv2|SSLv3" + } + }, + "cipher": { + "type": "string", + "example": "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;" + }, + "preferServerCipher": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "sessionCache": { + "type": "string", + "enum": [ + "OFF", + "NONE", + "BUILTIN", + "SHARED" + ], + "default": "OFF" + } + } + }, + "IngressUri": { + "type": "object", + "properties": { + "matchMethod": { + "$ref": "#/components/schemas/URIMatchMethod" + }, + "tls": { + "$ref": "#/components/schemas/TLS" + }, + "serverPoolPort": { + "description": "The port number used when the IngressUri is deployed to an Instance that's a member of a BIG-IP server pool.", + "type": "integer" + } + } + }, + "IngressUris": { + "type": "object", + "description": "Defines the URI in Gateways and Components. The URI has different requirements depending on where it is used.\n\nFor Web URIs in Gateways, `uris` must be a complete URI that follows the format `://host[:port]`;\nadditionally each URI can have a match method specified and an HTTPS URI can include TLS information.\n Examples:\n - `http://www.f5.com`\n - `https://www.f5.com`\n - `http://www.f5.com:8080`\n - `http://*.info.f5.com`\n\nFor Web URIs in Components, `uris` can be either a complete URI that follows the format `://host[:port][/path]`\nor a relative path that follows the format `/path[/...]`;\nadditionally each URI can have a match method specified and an HTTPS URI can include TLS information.\n Examples:\n - `/images`\n - `/*.jpg`\n - `/locations/us/wa*`\n - `http://www.f5.com:8080/sales`\n - `http://*.f5.com:5050/testing`\n\nFor TCP/UDP URIs in Gateways and Components,`uris` must be a complete URI that follows the format `://<*|IP>:`;\nadditionally a tcp+tls URI can include TLS information. Match method is not applicable to TCP/UDP URIs.\n Examples:\n - `tcp://192.168.1.1:12345`\n - `tcp+tls://192.168.1.1:12346`\n - `tcp://192.168.1.1:12345-12350`\n - `tcp://*:12345`\n - `udp://192.168.1.1:12345`\n - `udp://*:12345`\n\nIn a TCP/UDP Component, URIs can either all have a protocol of udp or a mix of TCP and tcp+tls.\n", + "additionalProperties": { + "description": "Provide the URI associated with the resource.", + "$ref": "#/components/schemas/IngressUri" + } + }, + "ComponentIngressCommon": { + "description": "Ingress settings common to Web and TCP/UDP components.", + "type": "object", + "required": [ + "uris" + ], + "properties": { + "uris": { + "$ref": "#/components/schemas/IngressUris" + }, + "gatewayRefs": { + "description": "Reference(s) to existing Gateway resource(s).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "tls": { + "$ref": "#/components/schemas/TLS" + } + } + }, + "ComponentWebIngressClient": { + "description": "Non-buffer settings in a Component applicable to Web client requests.", + "type": "object", + "properties": { + "bodyInFileOnly": { + "description": "Determines whether NGINX Controller should save the entire client request body into a file.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED", + "CLEAN" + ], + "default": "DISABLED", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only" + } + }, + "bodyTimeout": { + "description": "Defines a timeout for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout" + } + }, + "maxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.\n\nDisables checking of client request body size when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + } + } + }, + "ComponentWebIngress": { + "description": "Ingress settings in a Web Component.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentIngressCommon" + }, + { + "$ref": "#/components/schemas/WebIngressCommon" + }, + { + "type": "object", + "properties": { + "client": { + "$ref": "#/components/schemas/ComponentWebIngressClient" + }, + "buffers": { + "$ref": "#/components/schemas/WebIngressBuffersCommon" + } + } + } + ] + }, + "MonitoringCommon": { + "description": "Monitor settings common to Web and TCP/UDP.", + "type": "object", + "properties": { + "defaultState": { + "type": "string", + "enum": [ + "HEALTHY", + "UNHEALTHY" + ], + "default": "HEALTHY" + }, + "interval": { + "type": "integer", + "minimum": 1, + "default": 5 + }, + "consecutiveSuccessThreshold": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "consecutiveFailureThreshold": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "port": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "healthEvents": { + "description": "When enabled, the NGINX Controller Agent generates events related to the\nhealth of the workload group members. Two types of events are generated:\n- An event when the health status of a workload group member changes.\n- A periodic event per component with the health status of all workload groups.\n", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "default": "DISABLED" + } + } + }, + "MonitorAddHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds monitor header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the monitor header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the monitor header.", + "minLength": 1 + } + } + }, + "MonitorDeleteHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes monitor header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the monitor header to modify.", + "minLength": 1 + } + } + }, + "MonitorHeaderModification": { + "type": "object", + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/MonitorAddHeader", + "DELETE": "#/components/schemas/MonitorDeleteHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/MonitorAddHeader" + }, + { + "$ref": "#/components/schemas/MonitorDeleteHeader" + } + ] + }, + "MonitorResponseStatus": { + "type": "object", + "properties": { + "range": { + "type": "object", + "properties": { + "startCode": { + "type": "integer", + "minimum": 100, + "maximum": 599 + }, + "endCode": { + "type": "integer", + "minimum": 100, + "maximum": 599 + } + } + }, + "codes": { + "type": "array", + "items": { + "type": "integer", + "minimum": 100, + "maximum": 599 + } + }, + "match": { + "type": "boolean", + "default": true + } + } + }, + "MonitorResponseContent": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "match": { + "type": "boolean", + "default": true + } + } + }, + "WebMonitorResponse": { + "description": "Settings that define successful responses to a Web monitor.", + "type": "object", + "properties": { + "status": { + "$ref": "#/components/schemas/MonitorResponseStatus" + }, + "headers": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/MonitorResponseContent" + } + }, + "body": { + "$ref": "#/components/schemas/MonitorResponseContent" + } + } + }, + "WebMonitoring": { + "description": "Health monitor settings across all workload groups in a Web Component.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitoringCommon" + }, + { + "type": "object", + "properties": { + "uri": { + "description": "URI containing the relative path that the monitor probe is sent to; the host is specified in the URI in the workload group.", + "type": "string", + "default": "/" + }, + "headerModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MonitorHeaderModification" + } + }, + "response": { + "description": "Settings that define successful responses to a Web monitor.", + "$ref": "#/components/schemas/WebMonitorResponse" + } + } + } + ] + }, + "RoundRobinLB": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ROUND_ROBIN" + ] + } + } + }, + "IPHashLB": { + "type": "object", + "description": "IP Hash Load Balancing only applicable to Web Components.", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IPHASH" + ] + } + } + }, + "LeastConnLB": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "LEAST_CONNECTIONS" + ] + } + } + }, + "HashLBMethod": { + "type": "object", + "required": [ + "type", + "userKey" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "HASH" + ] + }, + "userKey": { + "type": "string" + }, + "consistentHash": { + "$ref": "#/components/schemas/ServiceConfigState" + } + } + }, + "LeastTimeLBMethod": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "LEAST_TIME" + ] + }, + "latencyParameter": { + "type": "string", + "description": "Values applicable to a Web Component are: [HEADER, LAST_BYTE, LAST_BYTE_INFLIGHT];\nValues applicable to a TCP/UDP Component are: [CONNECT, FIRST_BYTE, LAST_BYTE, LAST_BYTE_INFLIGHT].\nThe default value is used for a web Component; there is no default for a TCP/UDP Component.\n", + "enum": [ + "HEADER", + "CONNECT", + "FIRST_BYTE", + "LAST_BYTE", + "LAST_BYTE_INFLIGHT" + ], + "default": "HEADER" + } + } + }, + "RandomLBMethod": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "RANDOM" + ] + }, + "twoServerLBMethod": { + "type": "string", + "description": "Values applicable to a Web Component are: [LEAST_CONNECTIONS, LEAST_TIME_HEADER, LEAST_TIME_LAST_BYTE];\nValues applicable to a TCP/UDP Component are: [LEAST_CONNECTIONS, LEAST_TIME_CONNECT, LEAST_TIME_FIRST_BYTE, LEAST_TIME_LAST_BYTE].\n", + "enum": [ + "LEAST_CONNECTIONS", + "LEAST_TIME_HEADER", + "LEAST_TIME_CONNECT", + "LEAST_TIME_FIRST_BYTE", + "LEAST_TIME_LAST_BYTE" + ] + } + } + }, + "LoadBalancingMethod": { + "discriminator": { + "propertyName": "type", + "mapping": { + "ROUND_ROBIN": "#/components/schemas/RoundRobinLB", + "IPHASH": "#/components/schemas/IPHashLB", + "LEAST_CONNECTIONS": "#/components/schemas/LeastConnLB", + "HASH": "#/components/schemas/HashLBMethod", + "LEAST_TIME": "#/components/schemas/LeastTimeLBMethod", + "RANDOM": "#/components/schemas/RandomLBMethod" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/RoundRobinLB" + }, + { + "$ref": "#/components/schemas/IPHashLB" + }, + { + "$ref": "#/components/schemas/LeastConnLB" + }, + { + "$ref": "#/components/schemas/HashLBMethod" + }, + { + "$ref": "#/components/schemas/LeastTimeLBMethod" + }, + { + "$ref": "#/components/schemas/RandomLBMethod" + } + ] + }, + "DNSServiceDiscovery": { + "required": [ + "servers" + ], + "properties": { + "servers": { + "type": "array", + "description": "Array of DNS servers. Possible options are:\n- An IPv4 address with an optional port number.\n Port 53 is used if not specified.\n For example, \"10.1.1.1\", \"10.1.1.1:5353\".\n- An IPv6 address with an optional port number.\n Port 53 is used if not specified.\n For example, \"[2001::1]\", \"[2001::1]:5353\",\n- Fully qualified domain name (FQDN). ASCII characters only.\n NGINX uses the OS name server configuration\n to identify the IP addresses of the DNS servers to use.\n", + "items": { + "type": "string", + "pattern": "^(?:(?:(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(?::(?:[1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5]))?$)|(?:\\[\\s*(?:(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))|(?:(?:[0-9a-fA-F]{1,4}:){6}(?::[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-fA-F]{1,4}:){5}(?:(?:(?::[0-9a-fA-F]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-fA-F]{1,4}:){4}(?:(?:(?::[0-9a-fA-F]{1,4}){1,3})|(?:(?::[0-9a-fA-F]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){3}(?:(?:(?::[0-9a-fA-F]{1,4}){1,4})|(?:(?::[0-9a-fA-F]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){2}(?:(?:(?::[0-9a-fA-F]{1,4}){1,5})|(?:(?::[0-9a-fA-F]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){1}(?:(?:(?::[0-9a-fA-F]{1,4}){1,6})|(?:(?::[0-9a-fA-F]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-fA-F]{1,4}){1,7})|(?:(?::[0-9a-fA-F]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?](?::(?:[1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5]))?\\s*$)|(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*$))", + "minLength": 1, + "example": "10.1.1.1:5353" + }, + "minItems": 1, + "uniqueItems": true + }, + "ttl": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "description": "Overrides the TTL setting present in the DNS record.", + "example": "10s" + }, + "timeout": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "description": "Sets the timeout for domain name resolution.", + "example": "10s" + } + } + }, + "WorkloadGroupCommon": { + "description": "Settings common to Web and TCP/UDP workloadGroups.", + "type": "object", + "properties": { + "locationRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "loadBalancingMethod": { + "$ref": "#/components/schemas/LoadBalancingMethod" + }, + "dnsServiceDiscovery": { + "$ref": "#/components/schemas/DNSServiceDiscovery" + } + } + }, + "WebProxy": { + "description": "Proxy retry and timeout settings applicable to servers in a Web workloadGroup associated with a Component.", + "type": "object", + "properties": { + "nextUpstream": { + "description": "Specifies in which cases a request should be passed to the next server.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "ERROR", + "TIMEOUT", + "INVALID_HEADER", + "HTTP_500", + "HTTP_502", + "HTTP_503", + "HTTP_504", + "HTTP_403", + "HTTP_404", + "HTTP_429", + "NON_IDEMPOTENT", + "OFF" + ] + } + }, + "connectTimeout": { + "description": "Defines a timeout for establishing a connection with a proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + }, + "sendTimeout": { + "description": "Sets a timeout for transmitting a request to the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + } + } + }, + "SessionPersistenceCookie": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "COOKIE" + ] + }, + "srvID": { + "type": "string" + }, + "expireTime": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "domain": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "SessionPersistenceRoute": { + "type": "object", + "required": [ + "type", + "routeInfoLocation" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ROUTE" + ] + }, + "routeInfoLocation": { + "type": "string", + "enum": [ + "COOKIE", + "URI", + "BOTH" + ] + } + } + }, + "SessionPersistenceCookieLearn": { + "type": "object", + "required": [ + "type", + "create", + "lookup" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "COOKIE_LEARN" + ] + }, + "create": { + "type": "string", + "pattern": "^\\$.+" + }, + "lookup": { + "type": "string", + "pattern": "^\\$.+" + } + } + }, + "SessionPersistence": { + "description": "SessionPersistence settings in a Web workloadGroup.", + "discriminator": { + "propertyName": "type", + "mapping": { + "COOKIE": "#/components/schemas/SessionPersistenceCookie", + "ROUTE": "#/components/schemas/SessionPersistenceRoute", + "COOKIE_LEARN": "#/components/schemas/SessionPersistenceCookieLearn" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SessionPersistenceCookie" + }, + { + "$ref": "#/components/schemas/SessionPersistenceRoute" + }, + { + "$ref": "#/components/schemas/SessionPersistenceCookieLearn" + } + ] + }, + "WorkloadUri": { + "type": "object", + "properties": { + "weight": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "maxConns": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "maxFails": { + "type": "integer", + "minimum": 0, + "default": 1 + }, + "failTimeout": { + "x-f5-experimental": true, + "type": "string", + "default": "10s", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "isBackup": { + "type": "boolean", + "default": false + }, + "isDown": { + "type": "boolean", + "default": false + }, + "route": { + "x-f5-experimental": true, + "type": "string" + }, + "srvService": { + "type": "string" + }, + "slowStart": { + "x-f5-experimental": true, + "type": "integer", + "minimum": 0, + "default": 0 + }, + "isDrain": { + "type": "boolean", + "default": false + } + } + }, + "WebWorkloadGroup": { + "description": "Group of servers hosting a part of a Web application represented by a Component.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkloadGroupCommon" + }, + { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/components/schemas/WebProxy" + }, + "sessionPersistence": { + "$ref": "#/components/schemas/SessionPersistence" + }, + "uris": { + "type": "object", + "description": "The URI for a server hosting a part of a Web application.\n\nIt must conform to the format `schema://address[:port]`\nwhere schema is chosen from http or https, address is IP or hostname,\nschema and address must be provided.\n\nFor example:\n\n- `http://192.0.2.247`\n- `https://192.0.2.247:8443`\n- `https://www.f5workload.com`\n", + "additionalProperties": { + "$ref": "#/components/schemas/WorkloadUri" + } + } + } + } + ] + }, + "BackendBuffers": { + "description": "Proxy buffer settings applicable to servers across all Web workloadGroups associated with a Component.", + "type": "object", + "properties": { + "headerSize": { + "description": "Sets the size of the buffer used for reading the first part of the response received from the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size" + } + }, + "isEnabled": { + "description": "Enables or disables buffering of responses from the proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering" + } + }, + "size": { + "description": "Sets the number and size of the buffers used for reading a response from the proxied server, for a single connection.", + "type": "object", + "properties": { + "number": { + "type": "integer" + }, + "size": { + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$" + } + }, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers" + } + }, + "busySize": { + "description": "When buffering of responses from the proxied server is enabled, it limits the total size of buffers that can be busy sending a response to the client while the response is not yet fully read.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_busy_buffers_size" + } + }, + "ignoreClientAbort": { + "description": "Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort" + } + }, + "forceRanges": { + "description": "Enables byte-range support for both cached and uncached responses from the proxied server regardless of the \"Accept-Ranges\" field in these responses.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_force_ranges" + } + }, + "httpVersion": { + "description": "This field is deprecated. Use 'Backend.httpVersion' to set the desired HTTP Version.", + "type": "string", + "enum": [ + "1.0", + "1.1" + ], + "deprecated": true, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version" + } + }, + "rate": { + "description": "Limits the speed (in bytes per second) of reading the response from the proxied server.\nDisables rate limiting when set to `0`.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_limit_rate" + } + }, + "readTimeout": { + "description": "Defines a timeout for reading a response from the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout" + } + }, + "maxTempFileSize": { + "description": "Sets the maximum size of the temporary file that the response can be saved into. Note that the buffering of responses from proxied server is enabled and the response does not fit into the buffers.\n\nDisables temporary file usage when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size" + } + }, + "tempFileWriteSize": { + "description": "Limits the size of data written to a temporary file at a time, when buffering of responses from the proxied server to temporary files is enabled.\n\nDisables temporary file usage when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_file_write_size" + } + } + } + }, + "WebBackend": { + "description": "Backend settings in a Web Component.\n", + "type": "object", + "properties": { + "keepAlive": { + "type": "object", + "properties": { + "connections": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "requestsPerConn": { + "type": "integer" + }, + "idleTimeout": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "example": "1h" + } + } + }, + "monitoring": { + "$ref": "#/components/schemas/WebMonitoring" + }, + "workloadGroups": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/WebWorkloadGroup" + } + }, + "preserveHostHeader": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "queue": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "length" + ], + "properties": { + "length": { + "type": "integer" + }, + "timeOut": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "example": "1h" + } + } + }, + "httpVersion": { + "description": "Sets the HTTP protocol version for proxying.", + "type": "string", + "pattern": "^[1-3]{1}\\.[0-1]{1}$", + "example": 1 + }, + "ntlmAuthentication": { + "description": "Allows proxying requests with NTLM Authentication.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ntlm" + } + }, + "persistentState": { + "x-f5-experimental": true, + "type": "string" + }, + "buffers": { + "$ref": "#/components/schemas/BackendBuffers" + }, + "isSocketKeepaliveEnabled": { + "description": "Configures the “TCP keepalive” behavior for outgoing connections to a proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_socket_keepalive" + } + }, + "ignoreHeaders": { + "description": "Disables processing of certain response header fields from the proxied server.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "X-Accel-Redirect", + "X-Accel-Expires", + "X-Accel-Limit-Rate", + "X-Accel-Buffering", + "X-Accel-Charset", + "Expires", + "Cache-Control", + "Set-Cookie", + "Vary" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers" + } + }, + "debugHeaders": { + "description": "Permits passing otherwise disabled header fields from a proxied server to a client.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "X-Accel-Redirect", + "X-Accel-Expires", + "X-Accel-Limit-Rate", + "X-Accel-Buffering", + "X-Accel-Charset", + "Expires", + "Cache-Control", + "Set-Cookie", + "Vary" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_header" + } + }, + "tls": { + "description": "TLS settings applicable to servers in Web workloadGroups.", + "type": "object", + "properties": { + "cipher": { + "description": "Specifies the enabled ciphers for requests to a proxied HTTPS server.", + "type": "string", + "example": "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_ciphers" + } + }, + "name": { + "description": "Allows overriding the server name used to verify the certificate of the proxied HTTPS server.", + "type": "string", + "example": "$proxy_host", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_name" + } + }, + "protocols": { + "description": "Enables the specified protocols for requests to a proxied HTTPS server.", + "type": "array", + "items": { + "type": "string", + "pattern": "TLSv1|TLSv1\\.[1-3]|SSLv2|SSLv3" + }, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_protocols" + } + }, + "isServerNameEnabled": { + "description": "Enables or disables passing of the server name through TLS Server Name Indication extension (SNI, RFC 6066) when establishing a connection with the proxied HTTPS server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name" + } + }, + "isSessionReuseEnabled": { + "description": "Determines whether SSL sessions can be reused when working with the proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_session_reuse" + } + }, + "isVerifiedEnabled": { + "description": "Enables or disables verification of the proxied HTTPS server certificate.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify" + } + }, + "verifyDepth": { + "description": "Sets the verification depth in the proxied HTTPS server certificates chain.", + "type": "integer", + "minimum": 0, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify_depth" + } + } + } + } + } + }, + "UriRewrite": { + "type": "object", + "required": [ + "incomingPattern", + "rewritePattern" + ], + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + }, + "incomingPattern": { + "type": "string", + "description": "The regex pattern to match against the request URIs that are expected to be rewritten." + }, + "rewritePattern": { + "type": "string", + "description": "The replacement regex pattern to apply to the URIs that are to be rewritten.", + "minLength": 1 + }, + "afterExecute": { + "type": "string", + "enum": [ + "NONE", + "LAST", + "BREAK", + "REDIRECT", + "PERMANENT" + ], + "default": "BREAK" + } + } + }, + "UriRedirect": { + "type": "object", + "required": [ + "responseCode" + ], + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + }, + "responseCode": { + "type": "integer", + "minimum": 300, + "maximum": 308 + }, + "url": { + "type": "string", + "minLength": 1, + "description": "The return url to use for responses in the 301-308 range." + }, + "text": { + "type": "string", + "description": "The return text to send for 300 responses." + } + } + }, + "ProgrammabilityAction": { + "type": "string", + "enum": [ + "ADD", + "MODIFY", + "DELETE" + ] + }, + "CookieModification": { + "type": "object", + "required": [ + "action", + "cookieName" + ], + "properties": { + "action": { + "$ref": "#/components/schemas/ProgrammabilityAction" + }, + "cookieName": { + "type": "string" + }, + "cookieValue": { + "type": "string" + } + } + }, + "ProgrammabilityAddRequestHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds request header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the request header.", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ProgrammabilityDeleteRequestHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes request header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the request header to modify.", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "RequestHeaderModification": { + "type": "object", + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/ProgrammabilityAddRequestHeader", + "DELETE": "#/components/schemas/ProgrammabilityDeleteRequestHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ProgrammabilityAddRequestHeader" + }, + { + "$ref": "#/components/schemas/ProgrammabilityDeleteRequestHeader" + } + ] + }, + "ProgrammabilityAddResponseHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds response header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the response header.", + "minLength": 1 + }, + "responseCodeFilter": { + "type": "string", + "description": "The value to apply to the response code filter.", + "enum": [ + "ALWAYS", + "PRE_DEFINED" + ], + "default": "PRE_DEFINED" + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ProgrammabilityDeleteResponseHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes response header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.\n\n> Warning: `Date`, `Content-Length`, and `Connection` headers cannot be deleted.\n", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ResponseHeaderModification": { + "type": "object", + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/ProgrammabilityAddResponseHeader", + "DELETE": "#/components/schemas/ProgrammabilityDeleteResponseHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ProgrammabilityAddResponseHeader" + }, + { + "$ref": "#/components/schemas/ProgrammabilityDeleteResponseHeader" + } + ] + }, + "Programmability": { + "type": "object", + "properties": { + "uriRewrites": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UriRewrite" + } + }, + "httpHttpsRedirect": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "uriRedirects": { + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/UriRedirect" + } + }, + "cookieModifications": { + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/CookieModification" + } + }, + "requestHeaderModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RequestHeaderModification" + } + }, + "responseHeaderModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResponseHeaderModification" + } + } + } + }, + "Logging": { + "description": "Settings for error logs and access logs.", + "type": "object", + "properties": { + "errorLog": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "accessLog": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "format": { + "type": "string" + } + } + } + } + }, + "WAF": { + "description": "Defines the desired configurations for the WAF associated with the application component.", + "properties": { + "isEnabled": { + "type": "boolean", + "default": true, + "description": "Indicates whether the WAF is enabled or not." + }, + "isMonitorOnly": { + "type": "boolean", + "default": true, + "description": "Indicates whether the WAF will monitor or block security violations." + }, + "signatureOverrides": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "IGNORE" + ] + } + }, + "description": "Identifies overrides for the signatures contained within the associated security strategy.\n", + "example": { + "1234": { + "action": "IGNORE" + }, + "1235": { + "action": "IGNORE" + } + } + } + } + } + }, + "APIKeyClientAuth": { + "description": "Defines how an API client should provide their API Key credentials.", + "required": [ + "keyLocation" + ], + "properties": { + "keyLocation": { + "type": "string", + "enum": [ + "HEADER", + "QUERY_PARAM" + ] + }, + "key": { + "type": "string" + } + } + }, + "JWTClientAuth": { + "description": "Defines how an API Client should provide their JWT.", + "required": [ + "keyLocation" + ], + "properties": { + "keyLocation": { + "type": "string", + "enum": [ + "BEARER", + "HEADER", + "QUERY_PARAM", + "COOKIE" + ] + }, + "key": { + "type": "string" + } + } + }, + "ConditionalAuthPolicy": { + "description": "Defines further fine-grained access control on top of API Key or JWT Auth.", + "required": [ + "sourceType", + "comparisonType", + "comparisonValues", + "action", + "denyStatusCode" + ], + "properties": { + "sourceType": { + "type": "string", + "enum": [ + "HEADER", + "JWT_CLAIM" + ] + }, + "sourceKey": { + "type": "string" + }, + "comparisonType": { + "type": "string", + "enum": [ + "EQUALS", + "NOT_EQUALS", + "IN", + "CONTAINS" + ] + }, + "comparisonValues": { + "type": "array", + "description": "Valid values for the sourceType.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + } + }, + "action": { + "type": "string", + "enum": [ + "ALLOW", + "DENY" + ] + }, + "denyStatusCode": { + "type": "integer" + } + } + }, + "RateLimit": { + "required": [ + "rate" + ], + "properties": { + "rate": { + "type": "string", + "pattern": "^[0-9]+r\\/[m|s]{1}$", + "description": "Sets the maximum number of allowed requests.\n\nYou can specify the rate limit as requests per second (r/s) or requests per minute (r/m).\n", + "example": "10r/s" + }, + "burstBeforeReject": { + "type": "integer", + "minimum": 0 + }, + "burstBeforeDelay": { + "type": "integer", + "minimum": 0 + }, + "statusCode": { + "type": "integer", + "default": 429 + }, + "key": { + "type": "string", + "default": "$binary_remote_addr", + "description": "Parameters (NGINX variable) for a shared memory zone that stores states for various keys; used for `limit_req_zone`." + } + } + }, + "Security": { + "type": "object", + "description": "Defines the desired security configurations for the application component.", + "properties": { + "strategyRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "waf": { + "$ref": "#/components/schemas/WAF" + }, + "identityProviderRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + }, + "description": "The list of Identity Providers that are used in this Security policy." + }, + "apiKeyClientAuth": { + "$ref": "#/components/schemas/APIKeyClientAuth" + }, + "jwtClientAuth": { + "$ref": "#/components/schemas/JWTClientAuth" + }, + "conditionalAuthPolicies": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ConditionalAuthPolicy" + } + }, + "rateLimits": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/RateLimit" + } + }, + "interceptWorkloadErrors": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + } + } + }, + "InstanceGroupRef": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + }, + { + "type": "object", + "properties": { + "listenIps": { + "description": "The list of Listen IP addresses.\nSets the BIG-IP virtual address(es) on which the server listens for and accepts requests.\n", + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$", + "example": "1.1.1.1" + } + } + } + } + ] + }, + "Placement": { + "description": "Instances that have NGINX configuration applied corresponding to the Gateway and associated Components settings.", + "type": "object", + "properties": { + "instanceRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceRef" + } + }, + "instanceGroupRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroupRef" + } + } + } + }, + "GatewayIngressCommon": { + "description": "Ingress settings in a Gateway that apply to Web and TCP/UDP Components.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewaySocketSettings" + }, + { + "type": "object", + "required": [ + "uris", + "placement" + ], + "properties": { + "uris": { + "$ref": "#/components/schemas/IngressUris" + }, + "tls": { + "$ref": "#/components/schemas/TLS" + }, + "placement": { + "$ref": "#/components/schemas/Placement" + } + } + } + ] + }, + "HeaderMatchMethod": { + "type": "string", + "enum": [ + "PREFIX", + "REGEX", + "REGEX_CASE_SENSITIVE", + "SUFFIX", + "EXACT" + ], + "default": "REGEX" + }, + "IngressHeader": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "nameMatchMethod": { + "$ref": "#/components/schemas/HeaderMatchMethod" + }, + "value": { + "type": "string" + }, + "valueMatchMethod": { + "$ref": "#/components/schemas/HeaderMatchMethod" + } + } + }, + "WebIngressCommon": { + "description": "Ingress settings in a Gateway and Component that apply only to Web Components.", + "type": "object", + "properties": { + "methods": { + "description": "Specifies the HTTP method to use in requests.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "POST", + "GET", + "PUT", + "DELETE", + "PATCH", + "HEAD", + "TRACE", + "OPTIONS", + "CONNECT" + ] + } + }, + "clientMaxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.", + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$", + "deprecated": true, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + }, + "headers": { + "description": "Specifies the match method for headers to be used in requests.", + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/IngressHeader" + } + }, + "http2": { + "description": "Enable or disable HTTP/2 connections on the port. Normally, for this to work the `ssl` parameter should be specified as well,\nbut NGINX can also be configured to accept HTTP/2 connections without SSL.\nPossible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "spdy": { + "description": "Enables or disables acceptance of the SPDY connections on the specified port.\nNormally, for this to work the `ssl` parameter should be specified as well,\nbut NGINX can also be configured to accept SPDY connections without SSL. Possible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "proxyProtocol": { + "description": "Enables or disables the proxy protocol for all connections accepted on the specified port.\nThe `proxy protocol` enables NGINX and NGINX Plus to receive client connection information passed through proxy servers and load balancers,\nsuch as HAproxy and Amazon Elastic Load Balancer (ELB). The possible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "notFoundStatusCode": { + "x-f5-experimental": true, + "type": "integer", + "default": 404 + }, + "headersHashBucketSize": { + "description": "Sets the bucket size for hash tables used by the `proxy_hide_header` and `proxy_set_header` directives.", + "type": "integer", + "minimum": 1, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_bucket_size" + } + }, + "headersHashMaxSize": { + "description": "Sets the maximum size of hash tables used by the `proxy_hide_header` and `proxy_set_header` directives.", + "type": "integer", + "minimum": 1, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_max_size" + } + } + } + }, + "GatewayWebIngressClient": { + "description": "Non-buffer settings in a Gateway applicable to Web client requests.", + "type": "object", + "properties": { + "bodyInFileOnly": { + "description": "Determines whether NGINX Controller should save the entire client request body into a file.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED", + "CLEAN" + ], + "default": "DISABLED", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only" + } + }, + "bodyTimeout": { + "description": "Defines a timeout for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout" + } + }, + "headerTimeout": { + "description": "Defines a timeout for reading the client request header.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout" + } + }, + "maxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.\n\nDisables checking of client request body size when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + } + } + }, + "WebIngressBuffersCommon": { + "description": "Buffer settings common to a Gateway and Component applicable to web client requests.", + "type": "object", + "properties": { + "clientBodyBufferingIsEnabled": { + "description": "Enables or disables buffering of a client request body.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering" + } + }, + "clientBodyBufferSize": { + "description": "Sets the buffer size for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size" + } + }, + "clientBodyInSingleBuffer": { + "description": "Determines whether NGINX Controller should save the entire client request body in a single buffer.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_single_buffer" + } + } + } + }, + "GatewayWebIngress": { + "description": "Ingress settings in a Gateway that apply only to Web Components.", + "type": "object", + "properties": { + "client": { + "$ref": "#/components/schemas/GatewayWebIngressClient" + }, + "allowUnderscoresInHeaders": { + "type": "boolean", + "default": false, + "description": "Allows the use of underscores in client request header fields.\n\nWhen set to `disabled`, request headers with names that contain underscores are considered invalid and are ignored.\n" + }, + "buffers": { + "allOf": [ + { + "$ref": "#/components/schemas/WebIngressBuffersCommon" + }, + { + "type": "object", + "properties": { + "clientHeaderBufferSize": { + "description": "Sets the buffer size for reading the client request header.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_buffer_size" + } + } + } + } + ] + } + } + }, + "GatewayIngress": { + "description": "Ingress settings in a Gateway.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayIngressCommon" + }, + { + "$ref": "#/components/schemas/WebIngressCommon" + }, + { + "$ref": "#/components/schemas/GatewayWebIngress" + } + ] + }, + "GatewayDesiredState": { + "description": "The desired gateway settings that the user wants in the configuration on NGINX instances referenced by this Gateway.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayWebState" + }, + { + "$ref": "#/components/schemas/GatewayStateCommon" + }, + { + "type": "object", + "required": [ + "ingress" + ], + "properties": { + "ingress": { + "$ref": "#/components/schemas/GatewayIngress" + } + } + } + ] + }, + "CertMetadata": { + "type": "object", + "description": "Public certificate metadata.", + "required": [ + "authorityKeyIdentifier", + "commonName", + "expired", + "expiry", + "issuer", + "publicKeyType", + "serialNumber", + "signatureAlgorithm", + "subject", + "subjectAlternativeName", + "subjectKeyIdentifier", + "thumbprint", + "thumbprintAlgorithm", + "validFrom", + "validTo", + "version" + ], + "properties": { + "authorityKeyIdentifier": { + "type": "string", + "example": "2B D0 69 47 94 76 09 FE F4 6B 8D 2E 40 A6 F7 47 4D 7F 08 5E", + "description": "The identifier of the signing authority for the certificate." + }, + "commonName": { + "type": "string", + "example": "www.myapp.com", + "description": "The Common Name (CN) for the certificate. This is typically a Fully Qualified Domain Name (FQDN), and must be the same as the web address users access when connecting to a web site." + }, + "expired": { + "type": "boolean", + "example": false, + "description": "Indicates the expiration status of the certificate." + }, + "expiry": { + "type": "integer", + "example": 35500034, + "description": "The number of seconds until the certificate will expire." + }, + "issuer": { + "type": "string", + "example": "DigiCert Class 3 Extended Validation SSL SGC CA.", + "description": "Identifies the entity who signed and issued the certificate." + }, + "publicKeyType": { + "type": "string", + "example": "RSA (2048 Bits)", + "description": "Identifies the encryption algorithm used to create the public key for the ceritficate." + }, + "serialNumber": { + "type": "string", + "example": "16469416336579571270", + "description": "A unique identifier for the certificate." + }, + "signatureAlgorithm": { + "type": "string", + "example": "SHA-256", + "description": "Identifies the algorithm used to sign the certificate." + }, + "subject": { + "type": "string", + "example": "www.myapp.com", + "description": "Contains the Distinguished Name (DN) information for the certificate." + }, + "subjectAlternativeName": { + "type": "string", + "example": "DNS Name=static.xxxx", + "description": "Defines additional identifies bound to the subject of the certificate. For example, the DNS name is used to add addtional domain names to a certificate." + }, + "subjectKeyIdentifier": { + "type": "string", + "example": "31 EA 76 A9 23 74 A5 DF D4 FD EE A0 C1 A6 9E C6 11 0E 11 EC", + "description": "A hash value of the SSL certificate that can be used to identify certificates that contain a particular public key." + }, + "thumbprint": { + "type": "string", + "example": "E6 A7 87 96 E0 C7 A3 E5 43 78 35 CA 16 78 5B 48 5A A9 DD C4 5C CD 0A 65 AA 89 33 E3 C3 D0 89 71", + "description": "A hash to ensure that the certificate has not been modified." + }, + "thumbprintAlgorithm": { + "type": "string", + "example": "SHA-1", + "description": "Defines the algorithm used to hash the certificate." + }, + "validFrom": { + "type": "string", + "example": "2019-07-29T09:12:33.001Z", + "description": "The start of the validity period for the certificate." + }, + "validTo": { + "type": "string", + "example": "2029-07-29T09:12:33.001Z", + "description": "The end of the validity period for the certificate." + }, + "version": { + "type": "integer", + "example": 3, + "description": "The version of the certificate, typically 3 for X.509 certificates." + } + } + }, + "CertDesiredState": { + "type": "object", + "discriminator": { + "propertyName": "type", + "mapping": { + "PEM": "#/components/schemas/PEM", + "PKCS12": "#/components/schemas/PKCS12", + "REMOTE_FILE": "#/components/schemas/RemoteFile" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/PEM" + }, + { + "$ref": "#/components/schemas/PKCS12" + }, + { + "$ref": "#/components/schemas/RemoteFile" + } + ] + }, + "CertList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "CertStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/CertDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/CertCurrentStatus" + } + } + }, + "CertCurrentStatus": { + "type": "object", + "description": "'Shows the current status of the certificate.\n\nWhen any certificates have expired, the Certs service sets `state.selfConfigState.isConfigured` and `state.selfConfigState.isError` to `true`. The service will also add a value to the conditons array with the type \"expiration\" and a message that shows when the first certificate will expire. For example, `conditions: [{type: \"expiration\", message: \"Certificate www.example.com will expire in 29 days.\"}])`'\n", + "required": [ + "state", + "certMetadata", + "type" + ], + "properties": { + "type": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "publicCert": { + "type": "string" + }, + "data": { + "type": "string" + }, + "password": { + "type": "string" + }, + "caCerts": { + "type": "array", + "items": { + "type": "string" + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "certMetadata": { + "type": "array", + "description": "Public certificate metadata.", + "items": { + "$ref": "#/components/schemas/CertMetadata" + } + } + } + }, + "Cert": { + "type": "object", + "description": "Contains the certificate to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/CertDesiredState" + } + } + }, + "PEM": { + "type": "object", + "description": "Defines a PEM-formatted certificate that contains a key and certificates.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\nThe private key data will be redacted in the response for all get and list requests.\n", + "required": [ + "privateKey", + "publicCert", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PEM" + ] + }, + "password": { + "type": "string", + "example": "myPa$$w0rd", + "description": "The passphrase to use to decrypt the private key. Required if the private key is encrypted." + }, + "privateKey": { + "type": "string", + "example": "-----BEGIN PRIVATE KEY-----\\n MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALSQBtRafNJtTqN0\\n nYiZq6TZUsHjfG2R9PlK6jsvno9O6amN96Al6ZSTTDjhr4VU7/RJ0p/cisiCboCX\\n 4cCq6lFKpIpeZJI=\\n -----END PRIVATE KEY-----", + "description": "The private key used to sign the public certificate.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`). The private key data will be redacted in the response for all get and list requests.\n" + }, + "publicCert": { + "type": "string", + "example": "-----BEGIN CERTIFICATE-----\\n MIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\n MiJVGawyxDzBm2UhzNOE0ABHfjAgM6PAYmtMhhQawk6bmttXYhJeqhLSji4LEj5d\\n Z4FmXQ5rWM0RWBs=\\n -----END CERTIFICATE-----", + "description": "The end-entity certificate, in PEM format.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n" + }, + "caCerts": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "-----BEGIN CERTIFICATE-----\\n MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh\\n WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf\\n SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==\\n -----END CERTIFICATE-----" + ], + "description": "An optional list of intermediate certificates in PEM format that are used to validate the public certificate.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n" + } + } + }, + "PKCS12": { + "type": "object", + "description": "Defines a cert with key and certificates encoded in PKCS12 format.", + "required": [ + "data", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PKCS12" + ] + }, + "data": { + "type": "string", + "example": "MIIGoQIBAzCCBmcGCSqGSIb3DQEHAaCCBlgEggZUMIIGUDCCA08GCSqGSIb3DQEHBqCCA0AwggM8AgEAMIIDNQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIe7ZblBoEW3QCAggAgIIDCCgLEvzp9n69QbpGT0MDEwITAJBgUrDgMCGgUABBQJs6ZgeAMcxVLrq1hU+TlUOArMuQQIGK59vCBn0wECAggA", + "description": "A base-64-encoded string that contains a private key, a public certificate, and, optionally, other intermediate certificates." + }, + "password": { + "type": "string", + "example": "myPa$$w0rd", + "description": "The password to use to decrypt PKCS12 data." + } + } + }, + "RemoteFile": { + "type": "object", + "description": "Define a Cert resource by providing references to remote files.\n\n> **Note:** These are file path references only. The system can not validate the file contents or extract the certificate metadata. Providing a PEM or PKCS12 certificate is recommended.\n", + "required": [ + "privateKey", + "publicCert", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "REMOTE_FILE" + ] + }, + "privateKey": { + "type": "string", + "example": "/certs/www.example.com/example.key", + "description": "The path to the private key file." + }, + "publicCert": { + "type": "string", + "example": "/certs/www.example.com/example.crt", + "description": "The path to the certificate bundle file. The file must contain the public certificate and may contain additional intermediate certificates." + } + } + }, + "IdentityProviderList": { + "type": "object", + "description": "Contains a list of Identity Provider resources.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "APIKeyIdentityProvider": { + "required": [ + "type" + ], + "type": "object", + "description": "Use an API key for authentication.\n\n> **Note:** Use of API Key authN is not recommended in production environments.\n", + "properties": { + "type": { + "type": "string", + "enum": [ + "API_KEY" + ] + } + } + }, + "JWTIdentityProvider": { + "required": [ + "jwkFile", + "type" + ], + "type": "object", + "description": "Use a JWT for authentication.", + "properties": { + "type": { + "type": "string", + "enum": [ + "JWT" + ] + }, + "jwkFile": { + "description": "Provide the path to - or URI for - a `.jwk` file to use for authentication.\nYou can also provide the `.jwk` file contents inline.\n", + "discriminator": { + "propertyName": "type", + "mapping": { + "INLINE": "#/components/schemas/JWKInline", + "REMOTE_FILE": "#/components/schemas/JWKRemoteFile" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/JWKInline" + }, + { + "$ref": "#/components/schemas/JWKRemoteFile" + } + ] + } + } + }, + "IdentityProviderDesiredState": { + "required": [ + "environmentRefs", + "identityProvider" + ], + "type": "object", + "properties": { + "environmentRefs": { + "description": "The Enviroment associated with the Identity Provider.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "identityProvider": { + "$ref": "#/components/schemas/IdentityProviderData" + } + }, + "example": { + "environmentRefs": [ + { + "ref": "/services/environments/env1" + } + ], + "identityProvider": { + "type": "JWT", + "jwkFile": { + "type": "REMOTE_FILE", + "uri": "https://example.com/keys.jwk", + "cacheExpire": "10h" + } + } + } + }, + "IdentityProviderCurrentStatus": { + "required": [ + "environmentRefs", + "identityProvider", + "state" + ], + "type": "object", + "properties": { + "environmentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "identityProvider": { + "$ref": "#/components/schemas/IdentityProviderData" + } + } + }, + "IdentityProvider": { + "required": [ + "desiredState", + "metadata" + ], + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderDesiredState" + } + } + }, + "IdentityProviderData": { + "description": "The means of authentication used by the Identity Provider (JWT or APIKey).", + "oneOf": [ + { + "$ref": "#/components/schemas/JWTIdentityProvider" + }, + { + "$ref": "#/components/schemas/APIKeyIdentityProvider" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "API_KEY": "#/components/schemas/APIKeyIdentityProvider", + "JWT": "#/components/schemas/JWTIdentityProvider" + } + } + }, + "IdentityProviderClientDesiredState": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/IdentityProviderClientCredential" + } + } + }, + "IdentityProviderClientCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "credential": { + "$ref": "#/components/schemas/IdentityProviderClientCredential" + } + } + }, + "IdentityProviderClient": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderClientCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderClientDesiredState" + } + } + }, + "IdentityProviderClientCredential": { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityProviderAPIKey" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "API_KEY": "#/components/schemas/IdentityProviderAPIKey" + } + } + }, + "IdentityProviderClientList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "UpdateIdentityProviderClient": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderClientCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderClientDesiredState" + } + } + }, + "JWK": { + "type": "object", + "properties": { + "kty": { + "type": "string", + "description": "The cryptographic algorithm family used with the key, such as \"RSA\" or \"EC\"." + }, + "use": { + "type": "string", + "description": "The intended use of the public key, whether for encrypting data or verifying the signature on data." + }, + "key_ops": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The operation(s) for which the key is intended to be used." + }, + "alg": { + "type": "string", + "description": "The algorithm intended for use with the key." + }, + "kid": { + "type": "string", + "description": "The key ID used to match a specific key." + }, + "x5u": { + "type": "string", + "description": "The X.509 URL that refers to a resource for an X.509 public key certificate or certificate chain." + }, + "x5c": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The X.509 Certificate Chain of one or more PKIX certificates. The PKIX certificate containing the key value MUST be the first certificate." + }, + "x5t": { + "type": "string", + "description": "The X.509 Certificate SHA-1 Thumbprint (a.k.a. digest) of the DER encoding of an X.509 certificate." + }, + "x5t256": { + "type": "string", + "description": "The X.509 Certificate SHA-256 Thumbprint (a.k.a. digest) of the DER encoding of an X.509 certificate." + }, + "p2s": { + "type": "string", + "description": "The salt input value for PBES2 key encryption, which is used as part of the PBKDF2 salt value." + }, + "p2c": { + "type": "string", + "description": "The PBKDF2 iteration count for PBES2 key encryption, represented as a positive JSON integer. The iteration count adds computational expense, ideally compounded by the possible range of keys introduced by the salt. A minimum iteration count of 1000 is RECOMMENDED." + }, + "crv": { + "type": "string", + "description": "The cryptographic curve used for an Elliptic Curve public key." + }, + "x": { + "type": "string", + "description": "The x coordinate of the point for an Elliptic Curve public key." + }, + "y": { + "type": "string", + "description": "The y coordinate of the point for an Elliptic Curve public key." + }, + "e": { + "type": "string", + "description": "The exponent value for an RSA public key." + }, + "exp": { + "type": "string", + "description": "The exponent value for an RSA public key." + }, + "n": { + "type": "string", + "description": "The modulus value for an RSA public key." + }, + "mod": { + "type": "string", + "description": "The modulus value for an RSA public key." + }, + "d": { + "type": "string", + "description": "The private key value for an Elliptic Curve private key OR the private exponent value for an RSA private key." + }, + "p": { + "type": "string", + "description": "The first prime factor for an RSA private key." + }, + "q": { + "type": "string", + "description": "The second prime factor for an RSA private key." + }, + "dp": { + "type": "string", + "description": "The Chinese Remainder Theorem (CRT) exponent of the first factor for an RSA private key." + }, + "dq": { + "type": "string", + "description": "The CRT exponent of the second factor for an RSA private key." + }, + "qi": { + "type": "string", + "description": "The CRT coefficient of the second factor for an RSA private key." + }, + "oth": { + "description": "An array of information about any third and subsequent primes, should they exist.", + "type": "array", + "items": { + "type": "object", + "properties": { + "r": { + "type": "string", + "description": "The prime factor." + }, + "d": { + "type": "string", + "description": "The factor CRT exponent of the corresponding prime factor." + }, + "t": { + "type": "string", + "description": "The factor CRT coefficient of the corresponding prime factor." + } + } + } + }, + "iv": { + "type": "string", + "description": "The base64url-encoded representation of the 96-bit Initialization Vector value used for the AES GCM key encryption operation." + }, + "tag": { + "type": "string", + "description": "The base64url-encoded representation of the 128-bit Authentication Tag value resulting from the AES GCM key encryption operation." + }, + "k": { + "type": "string", + "description": "The key value of the symmetric (or other single-valued) key." + }, + "enc": { + "type": "string", + "description": "The encryption algorithm for JWE." + }, + "epk": { + "type": "object", + "description": "The ephemeral public key value created by the originator for use in ECDH-ES key agreement algorithms." + }, + "apu": { + "type": "string", + "description": "The agreement PartyUInfo for ECDH-ES key agreement algorithms, containing information about the producer." + }, + "apv": { + "type": "string", + "description": "The agreement PartyVInfo for ECDH-ES key agreement algorithms." + } + } + }, + "JWKInline": { + "required": [ + "type", + "keys" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "INLINE" + ] + }, + "keys": { + "type": "array", + "description": "The JSON Web Keys.\n", + "items": { + "$ref": "#/components/schemas/JWK" + }, + "example": [ + { + "k": "ZmFudGFzdGljand0", + "kty": "oct", + "kid": 1 + } + ] + } + }, + "description": "Inline contents of a JWK JSON file.\n" + }, + "JWKRemoteFile": { + "required": [ + "uri", + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "REMOTE_FILE" + ] + }, + "uri": { + "type": "string" + }, + "cacheExpire": { + "pattern": "^[0-9]+[h|m|s]{1}$", + "type": "string", + "description": "The length of time for which to cache the remote file.\nNGINX will retrieve the file from the source URI when the cache time expires.\n", + "example": "10h" + } + } + }, + "IdentityProviderAPIKey": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "API_KEY" + ] + }, + "apiKey": { + "type": "string", + "description": "If left empty, a key will automatically be generated.\nThe apikey must contain only alphanumeric characters, underscores, and hyphens.\nThe length of the apikey must be between 8 - 256 characters.\n", + "example": "ADv-2ZheQnL_jVx5klhQ39" + } + } + }, + "ListInstanceGroupsResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + } + }, + "GetInstanceGroupResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/InstanceGroup" + } + ] + }, + "InstanceGroup": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceGroupState" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceGroupStatus" + } + } + }, + "InstanceGroupState": { + "type": "object", + "properties": { + "bigIpIntegration": { + "$ref": "#/components/schemas/BigIpIntegration" + }, + "locationRef": { + "description": "Reference to location all instances of the group belong to. If not specified, the default 'unspecified' is assumed.", + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "InstanceGroupStatus": { + "type": "object", + "required": [ + "state" + ], + "properties": { + "instanceRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceRef" + } + }, + "bigIpIntegration": { + "$ref": "#/components/schemas/BigIpIntegration" + }, + "locationRef": { + "description": "Reference to location all instances of the group belong to. If not specified, the default 'unspecified' is assumed.", + "$ref": "#/components/schemas/ResourceRef" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "InstanceRef": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + } + ], + "description": "Reference to a member Instance resource." + }, + "BigIpIntegration": { + "type": "object", + "required": [ + "integrationRef", + "serverPoolIp" + ], + "properties": { + "integrationRef": { + "description": "Reference to a BIG-IP Integration object, indicating that the Instances will be members of a BIG-IP server pool.", + "$ref": "#/components/schemas/ResourceRef" + }, + "serverPoolIp": { + "description": "The Instance IP addresses or CIDR to use when the Instance is a member of a BIG-IP server pool.\nIf this is a CIDR, then the Instance IP address that matches the mask will be the member address in the BIG-IP server pool.\nOtherwise, absolute IP addresses will be used as server-pool member addresses.\n", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "DevPortalsList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "DevPortal": { + "type": "object", + "description": "A Dev Portal.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/DevPortalDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/DevPortalCurrentStatus" + } + }, + "additionalProperties": false + }, + "DevPortalDesiredState": { + "type": "object", + "required": [ + "ingress" + ], + "properties": { + "ingress": { + "type": "object", + "required": [ + "gatewayRefs" + ], + "properties": { + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateways that act as a Developer Portal.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "additionalProperties": false + }, + "devPortalTheme": { + "$ref": "#/components/schemas/DevPortalTheme" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devPortalType": { + "type": "string", + "enum": [ + "private", + "public", + "partner" + ] + } + }, + "additionalProperties": false + }, + "DevPortalCurrentStatus": { + "type": "object", + "properties": { + "ingress": { + "type": "object", + "required": [ + "gatewayRefs" + ], + "properties": { + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateways that act as a Developer Portal.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "devPortalTheme": { + "$ref": "#/components/schemas/DevPortalTheme" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "publishedTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "Published time is a timestamp that represents the server time when the resource was published.\nResources that have never been published do not have an `published_time` stamp.\nThe default value is language-specific and, in general, should be equivalent of the null construct.\nIn JSON format, `published_time` type is encoded as a string as described in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n" + } + } + }, + "DevPortalTheme": { + "description": "Specifies the theming for the Developer Portal.", + "type": "object", + "properties": { + "overrideDefaultTheme": { + "type": "boolean", + "example": false, + "description": "Override the default Dev Portal theme with a custom theme." + }, + "customConfig": { + "type": "object", + "properties": { + "primary": { + "$ref": "#/components/schemas/ThemeConfig" + }, + "secondary": { + "$ref": "#/components/schemas/ThemeConfig" + }, + "fonts": { + "type": "object", + "properties": { + "assignments": { + "$ref": "#/components/schemas/FontAssignments" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "brandName": { + "$ref": "#/components/schemas/BrandName" + }, + "logo": { + "$ref": "#/components/schemas/FileEncodedString" + }, + "defaultLogo": { + "$ref": "#/components/schemas/FileEncodedString" + }, + "favicon": { + "$ref": "#/components/schemas/FileEncodedString" + } + }, + "additionalProperties": false + }, + "ThemeConfig": { + "type": "object", + "properties": { + "color": { + "$ref": "#/components/schemas/ThemeConfigColors" + } + }, + "additionalProperties": false + }, + "ThemeConfigColors": { + "type": "object", + "properties": { + "primary": { + "type": "string", + "example": "#575fe6", + "description": "A CSS color string used as a primary brand theme color." + }, + "accent": { + "type": "string", + "example": "#48dbac", + "description": "A CSS color string used as an optional second brand theme color." + }, + "gray": { + "type": "string", + "example": "#1e1f27", + "description": "A CSS color string used to generate a grayscale color palette." + }, + "link": { + "type": "string", + "example": "#0f55bd", + "description": "A CSS color string used to generate anchor link colors." + }, + "fill": { + "type": "string", + "example": "#fafbfc", + "description": "A CSS color string used as the main background color." + }, + "ink": { + "type": "string", + "example": "#323441", + "description": "A CSS color string used as the main text color." + }, + "status": { + "$ref": "#/components/schemas/ThemeConfigStatusColors" + } + }, + "additionalProperties": false + }, + "ThemeConfigStatusColors": { + "type": "object", + "description": "A collection of CSS color strings used to indicate status.", + "properties": { + "info": { + "type": "string", + "example": "#20a9ea", + "description": "A CSS color string used to indicate an informational status." + }, + "success": { + "type": "string", + "example": "#37c497", + "description": "A CSS color string used to indicate a success status." + }, + "error": { + "type": "string", + "example": "#ed4f54", + "description": "A CSS color string used to indicate an error status." + }, + "warning": { + "type": "string", + "example": "#ffb900", + "description": "A CSS color string used to indicate a warning status." + } + }, + "additionalProperties": false + }, + "ThemeConfigFonts": { + "type": "object", + "description": "A collection of fonts for theming typography.", + "properties": { + "headings": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for headlines." + }, + "body": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for body copy." + }, + "cta": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for calls to action." + }, + "code": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for code and syntax highlighting." + }, + "special": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for special accent typography." + }, + "baseFontSize": { + "$ref": "#/components/schemas/BaseFontSize" + }, + "embeddedLink": { + "$ref": "#/components/schemas/EmbeddedLink" + } + }, + "additionalProperties": false + }, + "ThemeConfigFont": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": [ + "google-web-font" + ] + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false + }, + "FileEncodedString": { + "type": "string", + "example": "c29tZXRoaW5nIA==", + "description": "Base64 encoded string of a logo." + }, + "BrandName": { + "type": "string", + "example": "Acme", + "description": "Name of the brand." + }, + "BaseFontSize": { + "type": "integer", + "example": 14 + }, + "EmbeddedLink": { + "type": "string" + }, + "FontAssignments": { + "type": "object", + "$ref": "#/components/schemas/ThemeConfigFonts" + }, + "EnvironmentName": { + "type": "string" + }, + "EnvironmentList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "Environment": { + "type": "object", + "description": "An Environment is a logical container that you can use to organize your Apps. A few commonly-used examples of Environments are \"dev\" and \"production\".", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "x-f5-experimental": true, + "type": "object" + }, + "currentStatus": { + "$ref": "#/components/schemas/EnvironmentCurrentStatus" + } + } + }, + "EnvironmentCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "gatewayRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "appRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "certRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "AppName": { + "type": "string" + }, + "APIDefinition": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/APIDefinitionCurrentStatus" + } + } + }, + "APIDefinitionCurrentStatus": { + "type": "object", + "properties": { + "apiDefinitionVersionRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "APIDefinitionList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "APIDefinitionSpecMapping": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/RESTAPISpec" + }, + { + "$ref": "#/components/schemas/gRPCProxySpec" + } + ] + } + }, + "RESTAPISpec": { + "type": "object", + "description": "Validates an Imported OpenAPI 3 spec formatted as JSON using the [OAS v3 schema.yaml](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.yaml) specification.\n" + }, + "gRPCProxySpec": { + "x-f5-experimental": true, + "type": "object", + "description": "Validates an Imported gRPC spec.\n" + }, + "APIDefinitionVersion": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/APIDefinitionVersionMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/APIDefinitionVersionDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/APIDefinitionVersionCurrentStatus" + } + } + }, + "APIDefinitionVersionList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "APIDefinitionVersionDesiredState": { + "type": "object", + "properties": { + "specs": { + "$ref": "#/components/schemas/APIDefinitionSpecMapping" + } + } + }, + "APIDefinitionVersionCurrentStatus": { + "type": "object", + "properties": { + "specs": { + "$ref": "#/components/schemas/APIDefinitionSpecMapping" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "apiDefinitionVersionRef": { + "type": "object", + "properties": { + "ref": { + "type": "string", + "description": "Reference to the Version of the API Definition.\n", + "example": "/services/api-definitions/baseball-stats/versions/v1" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "APIDefinitionVersionMeta": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceMeta" + }, + { + "type": "object", + "properties": { + "isDefaultVersion": { + "type": "boolean" + } + } + } + ] + }, + "Instance": { + "type": "object", + "description": "An NGINX Instance.", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceDesiredState" + } + } + }, + "GetInstanceResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Instance" + } + ] + }, + "ListInstanceResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Instance" + } + } + } + }, + "InstanceRequest": { + "allOf": [ + { + "$ref": "#/components/schemas/Instance" + } + ], + "description": "Describes the Instance to update." + }, + "InstanceDesiredState": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/AWSInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/AzureInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/VSphereInstanceDesiredState" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_INSTANCE": "#/components/schemas/OtherInstanceDesiredState", + "AWS_INSTANCE": "#/components/schemas/AWSInstanceDesiredState", + "AZURE_INSTANCE": "#/components/schemas/AzureInstanceDesiredState", + "VSPHERE_INSTANCE": "#/components/schemas/VSphereInstanceDesiredState" + } + } + }, + "InstanceCurrentStatus": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/AWSInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/AzureInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/VSphereInstanceCurrentStatus" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_INSTANCE": "#/components/schemas/OtherInstanceCurrentStatus", + "AWS_INSTANCE": "#/components/schemas/AWSInstanceCurrentStatus", + "AZURE_INSTANCE": "#/components/schemas/AzureInstanceCurrentStatus", + "VSPHERE_INSTANCE": "#/components/schemas/VSphereInstanceCurrentStatus" + } + } + }, + "OtherInstanceDesiredState": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "OTHER_INSTANCE is an Instance pre-installed and self-registered during NGINX installation.\n", + "enum": [ + "OTHER_INSTANCE" + ] + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "AWSInstanceDesiredState": { + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "AWS_INSTANCE is an Instance hosted in Amazon Web Services (AWS).\n", + "enum": [ + "AWS_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "AzureInstanceDesiredState": { + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "AZURE_INSTANCE is an Instance hosted in Microsoft Azure.", + "enum": [ + "AZURE_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "VSphereInstanceDesiredState": { + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "An Instance that resides on a VSphere host.\n", + "enum": [ + "VSPHERE_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "OtherInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the Other Instance.", + "required": [ + "type", + "hostname", + "version", + "agent", + "status", + "muted" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "OTHER_INSTANCE is an Instance pre-installed and self-registered during NGINX installation.\n", + "enum": [ + "OTHER_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/OtherNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "status": { + "deprecated": true, + "allOf": [ + { + "$ref": "#/components/schemas/ConfigState" + } + ] + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "AWSInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the AWS Instance.", + "required": [ + "type", + "hostname", + "version", + "agent", + "muted" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "AWS_INSTANCE is an Instance hosted in Amazon Web Services (AWS).\n", + "enum": [ + "AWS_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/AWSNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "AzureInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the Azure Instance.", + "required": [ + "type", + "hostname", + "version", + "agent" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the mute status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "AZURE_INSTANCE is an Instance hosted in Microsoft Azure.", + "enum": [ + "AZURE_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/AzureNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "VSphereInstanceCurrentStatus": { + "type": "object", + "description": "Reflects the current status of the VSphere Instance.", + "required": [ + "type", + "version", + "hostname", + "agent" + ], + "properties": { + "type": { + "type": "string", + "description": "An Instance that resides on a VSphere host.\nVSPHERE_INSTANCE is an Instance hosted in VSphere.\n", + "enum": [ + "VSPHERE_INSTANCE" + ] + }, + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "TemplateRef": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + } + ], + "description": "Reference to an existing Instance Template resource. This field cannot be updated." + }, + "LegacySystemMetadata": { + "type": "object", + "deprecated": true, + "description": "Metadata that describe the operating system attributes and properties of an Instance host system. It is\nintended for internal use only and is subject to change.\n", + "additionalProperties": true + }, + "LegacyNginxMetadata": { + "type": "object", + "deprecated": true, + "description": "Metadata that describe an Instance's NGINX process configuration and properties. It is intended\nfor internal use only and is subject to change.\n", + "additionalProperties": true + }, + "Agent": { + "type": "object", + "description": "The properties of the Controller Agent running on the Instance", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string", + "description": "The version of Controller Agent that is currently running on the Instance." + }, + "online": { + "type": "boolean", + "description": "The status of Controller Agent that is currently running on the Instance." + }, + "credentials": { + "$ref": "#/components/schemas/AgentCredentials" + } + } + }, + "AgentCredentials": { + "type": "object", + "description": "The credentials of the Controller Agent running on the Instance.", + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Agent." + }, + "uuid": { + "type": "string", + "description": "The uuid of the Agent." + } + } + }, + "OtherNetworkConfig": { + "type": "object", + "description": "The network config of a customer deployed Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OtherNetworkInterface" + } + } + } + }, + "OtherNetworkInterface": { + "type": "object", + "description": "A network interface for a customer deployed Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "privateDnsName": { + "type": "string", + "description": "The private, internal hostname of the instance, which resolves to the Instance's private IP address.\n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "privateIPv6": { + "type": "string", + "description": "The private IPv6 address of the network interface." + }, + "alternateIPList": { + "type": "array", + "items": { + "type": "string" + } + }, + "alternateIPv6List": { + "type": "array", + "items": { + "type": "string" + } + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "AWSNetworkConfig": { + "type": "object", + "description": "The network config of an AWS Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSNetworkInterface" + } + } + } + }, + "AWSNetworkInterface": { + "type": "object", + "description": "A network interface for an AWS Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "privateDnsName": { + "type": "string", + "description": "The private, internal hostname of the instance, which resolves to the Instance's private IP address. \n" + }, + "publicDnsName": { + "type": "string", + "description": "The public hostname of the instance, which resolves to the public IP address of the Instance. \n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "publicIP": { + "type": "string", + "description": "The public IP address of the network interface." + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "subnetID": { + "type": "string", + "description": "The ID of the subnet into which the instance was launched." + }, + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "AzureNetworkConfig": { + "type": "object", + "description": "The network config of an Azure Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureNetworkInterface" + } + } + } + }, + "AzureNetworkInterface": { + "type": "object", + "description": "A network interface associated with an Azure Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "publicDnsName": { + "type": "string", + "description": "The public hostname of the instance, which resolves to the public IP address of the Instance. \n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "publicIP": { + "type": "string", + "description": "The public IP address of the network interface." + }, + "privateIPv6": { + "type": "string", + "description": "The private IPv6 address of the network interface." + }, + "publicIPv6": { + "type": "string", + "description": "The public IPv6 address of the network interface." + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "subnetID": { + "type": "string", + "description": "The ID of the subnet that contains the Instance." + }, + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "Nginx": { + "type": "object", + "description": "Defines properties and configuration values for Nginx.\n", + "properties": { + "process": { + "$ref": "#/components/schemas/NginxProcess" + }, + "performance": { + "$ref": "#/components/schemas/Performance" + } + } + }, + "NginxProcess": { + "type": "object", + "description": "Defines configuration directives that are defined in the main configuration context.\n", + "properties": { + "user": { + "type": "string", + "description": "Defines user credentials used by worker processes.\n", + "default": "nginx" + }, + "group": { + "type": "string", + "description": "Defines group credentials used by worker processes. This will be ignored if the user\nproperty is not defined.\n", + "default": "nginx" + } + } + }, + "Performance": { + "type": "object", + "description": "Defines performance tuning directives that are defined in the main configuration context.\n", + "properties": { + "workerProcesses": { + "type": "integer", + "description": "Defines the number of worker processes. To set it to the number of available CPU cores\nfor a system, use 0.\n", + "minimum": 0, + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#worker_processes" + } + }, + "workerPriority": { + "type": "integer", + "description": "Defines the scheduling priority for worker processes like it is done by the nice command:\na negative number means higher priority. Allowed range normally varies from -20 to 20.\n", + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#worker_priority" + } + }, + "workerConnections": { + "type": "integer", + "description": "Sets the maximum number of simultaneous connections that can be opened by a worker process.\nThis number includes all the connections like proxied servers, connection with clients.\n", + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#worker_connections" + } + }, + "workerRlimitNofile": { + "type": "integer", + "description": "Sets the limit on the maximum number of open files for worker processes.\nUsed to increase the limit without restarting the main process.\n", + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile" + } + }, + "multiAccept": { + "type": "boolean", + "description": "Sets if the worker process will allow more than one connection at a time. If multiAccept is disabled,\nworker process only accepts one connection at a time.\n", + "externalDocs": { + "url": "https://nginx.org/en/docs/ngx_core_module.html#multi_accept" + } + } + } + }, + "SelfLinks": { + "type": "object", + "description": "The SelfLinks object contains a link from the resource to itself.\nThis object is used only in responses.\n", + "properties": { + "rel": { + "type": "string", + "example": "/api/v1/services/environments/prod", + "description": "`rel` contains the complete path fragment of a URI and can be used\nto construct a query to the object.\n" + } + } + }, + "ResourceMeta": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\*\\\"\\[\\]\\{\\}\\\\\\/%\\?:=&\\~\\^|#<>]+$", + "not": { + "type": "string", + "enum": [ + ".", + ".." + ] + }, + "minLength": 1, + "maxLength": 1024, + "example": "resource-name", + "description": "Resource name is a unique identifier for a resource within the context of a namespace.\nResource names must conform to [RFC 1738 Section 2.2](https://www.ietf.org/rfc/rfc1738.txt) and have a valid syntax for email addresses. The following rules are enforced:\n\n- do not utilize URL encoding;\n- do not include spaces;\n- do not use uppercase characters, for example, 'A-Z'; extended character sets are supported;\n- do not use the following characters: `\"`, `*`, `:`, `;`, `/`, `\\`, `%`, `?`, `hash`, `=`, `&`, `|`, `~`, `^`, `{`, `}`, `[`, `]`, `<`, `>`;\n- cannot start or end with an `@` sign;\n- cannot be only `.` or `..`\n\nFor example: For a collection resource located at\n\n`https://controller.example.com/api/v1/services/apps/shopping_@1`\n\nthe resource name is \"shopping_@1\".\n" + }, + "displayName": { + "type": "string", + "example": "My Display Name", + "description": "`displayName` is a user friendly resource name. It can be used to define \na longer, and less constrained, name for a resource.\n\nDisplay names:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "description": { + "type": "string", + "example": "This is a sample description string. It provides information about the resource.", + "description": "`description` is a free-form text property. You can use it to provide information that helps \nto identify the resource.\n\nDescriptions:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "kind": { + "type": "string", + "example": "-", + "description": "Kind is a string representation of an API resource's data type.\nIt is assigned by the server and cannot be changed. \n\nWhen creating a `kind`, the server uses hyphens to connect word segments; \nsingleton and collection item resources are not pluralized.\n" + }, + "uid": { + "type": "string", + "format": "uuid", + "example": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "description": "Unique Identifier (UID)\n\nUID is a unique identifier in time and space for a resource. \nWhen you create a resource, the server assigns a UID to the resource.\n\nRefer to [IETF RFC 4122](https://tools.ietf.org/html/rfc4122) for more information.\n" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ], + "description": "You can assign `tags` to a resource as a way to help map, scope, \nand organize resources. \n\nThe system uses tag selectors to specify selection criteria that \nmatch resources that have particular tags.\n" + }, + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "The `ref` field contains a reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/SelfLinks" + }, + "createTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was created.\n\nCreate time is not guaranteed to be set in \"happens-before\" order\nacross separate operations.\n\nIn JSON format, `create_time` type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n\nCreate Time is assigned by the server and cannot be changed.\n" + }, + "updateTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was last modified.\n\nResources that have never been updated do not have an `update_time` stamp.\n\nThe default value for resources that have never been updated is the local \nlanguage-specific equivalent of \"null\".\n\nIn JSON format, `update_time` type is encoded as a string as described in \n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n" + } + } + }, + "ConfigStateTally": { + "type": "object", + "properties": { + "isConfigured": { + "type": "boolean", + "description": "The configuration operation is complete." + }, + "isConfiguring": { + "type": "boolean", + "description": "The configuration of the resource, or of its child(ren), is in process." + }, + "isError": { + "type": "boolean", + "description": "An error occurred while configuring the resource or its child(ren)." + }, + "isDeleting": { + "type": "boolean", + "description": "A delete operation is in progress for the resource or its child(ren)." + }, + "total": { + "type": "integer", + "description": "The total number of resources to which the configuration operation applies." + }, + "configured": { + "type": "integer", + "description": "The number of resources that have a complete and valid configuration." + }, + "configuring": { + "type": "integer", + "description": "The number of resources that are in the process of being configured." + }, + "error": { + "type": "integer", + "description": "The number of resources that have encountered an error during the configuration process." + }, + "deleting": { + "type": "integer", + "description": "The number of resources that are in the process of being deleted." + } + } + }, + "ConfigCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The condition type." + }, + "message": { + "type": "string", + "description": "A human-readable message that provides additional information about the configuration operation." + } + } + }, + "ConfigState": { + "type": "object", + "description": "A representation of the resource's current configuration state \nthat comprises the status of the resource itself (`selfConfigState`) and any child \nresources (`childrenConfigState`).\n\nThe conditions array provides additional information during configuration changes.\n", + "properties": { + "selfConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "childrenConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigCondition" + } + } + } + }, + "NamedLinks": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfLinks" + }, + { + "type": "object", + "description": "Contains information about the object being referred to.\n\nThese are generally details -- like the object name and display name --\nthat are useful to a consumer of the API that performs further\nprocessing. \n\nThis object is only present in responses.\n \n", + "properties": { + "name": { + "type": "string", + "example": "production", + "description": "The name of the linked resource.\n" + }, + "displayName": { + "type": "string", + "example": "Production Environment", + "description": "A user friendly resource name." + } + } + } + ] + }, + "ResourceRef": { + "type": "object", + "required": [ + "ref" + ], + "properties": { + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "A reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "ErrorDetail": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "example": "Error doing : . This can lead to . Try to resolve the issue.", + "description": "A detailed error message returned by the server. \n\nThese messages contain the following information, where applicable:\n\n- What happened.\n- Why it happened.\n- What the consequences are (if any).\n- Recommended action to take to resolve the issue.\n" + } + } + }, + "ErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string", + "example": "Error doing .", + "description": "A human-readable message, in English, that describes the error.\n" + }, + "code": { + "type": "integer", + "example": 1234567, + "description": "A numeric error code that can be used to identify errors for support purposes.\n" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorDetail" + } + } + } + }, + "ErrorSetList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorSet" + } + } + } + }, + "ErrorSet": { + "type": "object", + "description": "Defines the set of error messages to be returned for HTTP errors.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/ErrorSetDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/ErrorSetCurrentStatus" + } + } + }, + "ErrorSetDesiredState": { + "type": "object", + "properties": { + "errorCodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorCode" + } + } + } + }, + "ErrorSetCurrentStatus": { + "type": "object", + "properties": { + "errorCodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorCode" + } + } + } + }, + "ErrorCode": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "minimum": 400, + "maximum": 599, + "example": 404 + }, + "message": { + "type": "string", + "example": "{\"status\":404,\"message\":\"Resource not found\"}" + } + } + }, + "PublishedAPIList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "PublishedAPI": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/PublishedAPICurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/PublishedAPIDesiredState" + } + } + }, + "PublishedAPICurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "basePath": { + "type": "string", + "default": "/" + }, + "stripWorkloadBasePath": { + "type": "boolean", + "default": true + }, + "componentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "apiDefinitionVersionRef": { + "description": "Reference to the Version of the API Definition.\n", + "$ref": "#/components/schemas/ResourceRef" + }, + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateway associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devportalRefs": { + "type": "array", + "description": "Reference to the Dev Portal associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "PublishedAPIDesiredState": { + "type": "object", + "required": [ + "apiDefinitionVersionRef", + "gatewayRefs" + ], + "properties": { + "basePath": { + "type": "string", + "default": "/" + }, + "stripWorkloadBasePath": { + "type": "boolean", + "default": true + }, + "apiDefinitionVersionRef": { + "description": "Reference to the Version of the API Definition.\n", + "$ref": "#/components/schemas/ResourceRef" + }, + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateway associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devportalRefs": { + "type": "array", + "description": "Reference to the Dev Portal associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "InstanceTemplate": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceTemplateState" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceTemplateState" + } + } + }, + "GetInstanceTemplateResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/InstanceTemplate" + } + ] + }, + "ListInstanceTemplateResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceTemplate" + } + } + } + }, + "InstanceTemplateState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSInstanceTemplate" + }, + { + "$ref": "#/components/schemas/AzureInstanceTemplate" + }, + { + "$ref": "#/components/schemas/VSphereInstanceTemplate" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_INSTANCE_TEMPLATE": "#/components/schemas/AWSInstanceTemplate", + "AZURE_INSTANCE_TEMPLATE": "#/components/schemas/AzureInstanceTemplate", + "VSPHERE_INSTANCE_TEMPLATE": "#/components/schemas/VSphereInstanceTemplate" + } + } + }, + "AWSInstanceTemplate": { + "type": "object", + "required": [ + "type", + "amiID", + "instanceType", + "subnetID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "AWS_INSTANCE_TEMPLATE" + ] + }, + "amiID": { + "type": "string", + "description": "The AWS `amiID` for the image to use when deploying an Instance using the template.\n" + }, + "instanceType": { + "type": "string", + "description": "The machine size.\n" + }, + "subnetID": { + "type": "string", + "description": "The `subnetID` of the AWS subnet where new Instances created using the Instance Template should reside.\n\nThe specified subnet must be in the same AWS Virtual Private Cloud (VPC) as the Instance Template's parent Location resource.\n" + }, + "securityGroupIDs": { + "type": "array", + "description": "The list of AWS securityGroupIDs that you want to apply to new Instances. \n\nThe Security GroupIDs must be available in the same AWS region and Virtual Private Cloud (VPC) as the Instance Template's parent Location resource.\n", + "items": { + "type": "string" + } + }, + "publicKey": { + "type": "string", + "description": "Provide the public key that you want to use to authenticate to the EC2 instance that this template will create. \n" + }, + "associatePublicIPAddress": { + "type": "boolean", + "description": "Specify if a public IP address should be assigned to the instance.\n" + } + } + }, + "AzureInstanceTemplate": { + "type": "object", + "required": [ + "type", + "instanceType", + "image", + "networkInterface", + "adminUser", + "publicKey" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "AZURE_INSTANCE_TEMPLATE" + ] + }, + "image": { + "$ref": "#/components/schemas/AzureImage" + }, + "instanceType": { + "type": "string", + "description": "The virtual machine size and type." + }, + "networkInterface": { + "$ref": "#/components/schemas/AzureNetworkInterface" + }, + "adminUser": { + "type": "string", + "description": "The name of the administration account." + }, + "publicKey": { + "type": "string", + "description": "The Public Key string for the adminUser." + } + } + }, + "AzureImage": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureImageID" + }, + { + "$ref": "#/components/schemas/AzureImageReference" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AZURE_IMAGE_ID": "#/components/schemas/AzureImageID", + "AZURE_IMAGE_REFERENCE": "#/components/schemas/AzureImageReference" + } + } + }, + "AzureImageID": { + "type": "object", + "description": "The Azure resource ID for the image to use when deploying an Instance.", + "required": [ + "type", + "imageID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Image.", + "enum": [ + "AZURE_IMAGE_ID" + ] + }, + "imageID": { + "type": "string", + "description": "The resource ID of the Azure image." + } + } + }, + "AzureImageReference": { + "type": "object", + "description": "The parameters that identify which Azure Marketplace image to use for the Instance.", + "required": [ + "type", + "publisher", + "offer", + "sku" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Image.", + "enum": [ + "AZURE_IMAGE_REFERENCE" + ] + }, + "publisher": { + "type": "string", + "description": "The publisher of the Azure Marketplace image." + }, + "offer": { + "type": "string", + "description": "The offer of the Azure Marketplace image." + }, + "sku": { + "type": "string", + "description": "The SKU of the Azure Marketplace image." + }, + "version": { + "type": "string", + "description": "The version of the Azure Marketplace image (default is latest)." + } + } + }, + "AzureNetworkID": { + "type": "object", + "description": "Identifies the existing Azure Network Interface that you want the Instance to use.", + "required": [ + "type", + "nicID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Network Interface.", + "enum": [ + "AZURE_NIC_ID" + ] + }, + "nicID": { + "type": "string", + "description": "The ID of the Azure Network Interface." + } + } + }, + "VSphereInstanceTemplate": { + "type": "object", + "required": [ + "type", + "image", + "computeResource", + "numCPUs", + "memoryMB" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "VSPHERE_INSTANCE_TEMPLATE" + ] + }, + "image": { + "type": "string", + "description": "The VSphere virtual machine template that you want to deploy an Instance from.\nBe sure to specify the full path to the desired template.\n" + }, + "computeResource": { + "type": "string", + "description": "The name of the VSphere Host, Cluster, or Resource Pool that you want to add the Instance to.\nBe sure to provide the full path to the desired resource.\n" + }, + "datastore": { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "string" + }, + "description": "A list of VSphere datastores that you want to attach to the Instance.\nBe sure to specify the full path to the desired resource(s).\n> Note: When defined, this setting will override the datastore configured in the virtual machine template.\n" + }, + "network": { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "string" + }, + "description": "A list of the VSphere networks that you want to attach to the Instance. You can connect the Instance to VM Networks, Distributed Virtual Switches, and/or Port Groups.\n> Note: When defined, this setting will override the network configured in the virtual machine template.\n" + }, + "numCPUs": { + "type": "integer", + "description": "The number of vCPUs to configure on the Instance.\n" + }, + "memoryMB": { + "type": "integer", + "description": "The amount of memory (in MB) to configure on the Instance.\n" + } + } + }, + "StrategyDesiredState": { + "type": "object", + "description": "The defired state of the strategy", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/StrategyData" + } + } + }, + "StrategyList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StrategyStatus" + } + } + } + }, + "StrategyStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/StrategyDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/StrategyCurrentStatus" + } + } + }, + "StrategyCurrentStatus": { + "type": "object", + "description": "Shows the current status of the strategy.", + "required": [ + "state", + "content" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/StrategyData" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "Strategy": { + "type": "object", + "description": "Contains the strategy to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/StrategyDesiredState" + } + } + }, + "StrategyData": { + "type": "object", + "description": "Strategy Data.", + "required": [ + "securityPolicyRef" + ], + "properties": { + "securityPolicyRef": { + "type": "string", + "description": "Reference to the Nginx Application Protection policy used in this strategy.", + "example": "/security/policies/mynappolicy" + } + } + }, + "Integration": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/IntegrationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/IntegrationState" + } + }, + "example": { + "metadata": { + "name": "my-aws-integration", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY_CREDENTIAL", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY_CREDENTIAL", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "GetIntegrationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Integration" + } + ] + }, + "ListIntegrationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "IntegrationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSIntegration" + } + ], + "discriminator": { + "propertyName": "type" + } + }, + "AWSIntegration": { + "required": [ + "type", + "credential" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AWS_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string" + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSAccessKeyCredential" + } + ], + "discriminator": { + "propertyName": "type" + } + } + } + }, + "AWSAccessKeyCredential": { + "required": [ + "type", + "accessKeyID", + "secretAccessKey" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AWS_ACCESS_KEY_CREDENTIAL" + ] + }, + "accessKeyID": { + "type": "string" + }, + "secretAccessKey": { + "type": "string" + } + } + }, + "PolicyDesiredState": { + "type": "object", + "description": "The defired state of the policy", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/PolicyData" + } + } + }, + "PolicyList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "PolicyStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/PolicyDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/PolicyCurrentStatus" + } + } + }, + "PolicyCurrentStatus": { + "type": "object", + "description": "Shows the current status of the policy.", + "required": [ + "state", + "data" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/PolicyData" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "Policy": { + "type": "object", + "description": "Contains the policy to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/PolicyDesiredState" + } + } + }, + "PolicyData": { + "type": "object", + "description": "Contains the policy to upload.", + "example": { + "policy": { + "name": "mynappolicy", + "template": { + "name": "POLICY_TEMPLATE_NGINX_BASE" + }, + "applicationLanguage": "utf-8", + "enforcementMode": "blocking", + "signatures": [ + { + "signatureId": 123458888, + "enabled": false + }, + { + "signatureId": 200000098, + "enabled": false + }, + { + "signatureId": 200001475, + "enabled": false + }, + { + "signatureId": 200002595, + "enabled": false + } + ], + "bot-defense": { + "settings": { + "isEnabled": false + } + }, + "headers": [ + { + "name": "*", + "type": "wildcard", + "decodeValueAsBase64": "disabled" + }, + { + "name": "*-bin", + "type": "wildcard", + "decodeValueAsBase64": "required" + }, + { + "name": "Referer", + "type": "explicit", + "decodeValueAsBase64": "disabled" + }, + { + "name": "Authorization", + "type": "explicit", + "decodeValueAsBase64": "disabled" + }, + { + "name": "Transfer-Encoding", + "type": "explicit", + "decodeValueAsBase64": "disabled" + } + ], + "cookies": [ + { + "name": "*", + "type": "wildcard", + "decodeValueAsBase64": "disabled" + } + ], + "parameters": [ + { + "name": "*", + "type": "wildcard", + "decodeValueAsBase64": "disabled" + } + ] + } + } + } + }, + "examples": { + "IdentityProviderRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "environmentRefs": [ + { + "ref": "/services/environments/dev" + } + ], + "identityProvider": { + "type": "API_KEY" + } + } + } + }, + "IdentityProviderClientListRequest": { + "value": { + "items": [ + { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + ] + } + }, + "IdentityProviderClientRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + }, + "IdentityProviderClientPatchMetadataRequest": { + "value": { + "metadata": { + "name": "resource-name", + "description": "This is a sample description string. It provides information about the resource." + } + } + }, + "IdentityProviderClientPatchDesiredStateRequest": { + "value": { + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + }, + "AWSInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "tags": [ + "prod-1", + "dev-1" + ] + }, + "desiredState": { + "type": "AWS_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/aws-east/instance-templates/small-dev-template" + } + } + } + }, + "AzureInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "tags": [ + "prod-1", + "dev-1" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/small-dev-template" + } + } + } + }, + "VSphereInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1" + }, + "desiredState": { + "type": "VSPHERE_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/dc-sea/instance-templates/small-dev-template" + } + } + } + }, + "InstanceUpdateRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "description": "An example NGINX Instance.", + "tags": [ + "prod-1", + "dev-1" + ] + } + } + }, + "AWSInstance": { + "value": { + "metadata": { + "name": "instance-1", + "displayName": "My Instance", + "tags": [ + "prod-1", + "dev-1" + ], + "links": { + "rel": "/infrastructure/locations/unspecified/instances/instance-1" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T09:12:33.001Z" + }, + "desiredState": { + "type": "AWS_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/aws-uswest-2/instance-templates/my-t2-medium" + } + }, + "currentStatus": { + "type": "AWS_INSTANCE", + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "hostname": "instance-1.mycloud.net", + "version": "1.17.3", + "muted": false, + "networkConfig": { + "networkInterfaces": [ + { + "name": "eth0", + "privateDnsName": "ip-172-16-0-71.us-west-2.compute.internal", + "publicDnsName": "ec2-54-212-110-173.us-west-2.compute.amazonaws.com", + "privateIP": "172.16.0.71", + "publicIP": "54.212.110.173", + "subnet": { + "subnetID": "subnet-055d28be58feb0a7d", + "cidrIPv4": "172.16.0.0/24" + } + } + ] + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": 2.8 + }, + "legacyNginxMetadata": { + "build": "nginx-plus-r19", + "built_from_source": false, + "last_seen": "2019-11-12T23:47:52.966607Z", + "pid": 2749, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "19-1~bionic" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": null, + "user": "nginx", + "with-cc-opt": "-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.17.3/debian/debuild-base/nginx-plus-1.17.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ] + }, + "start_time": 1573580604000 + }, + "legacySystemMetadata": { + "boot": 1573580280000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "network": { + "default": "lo", + "interfaces": { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + } + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": 1, + "cpus": 4, + "hypervisor": "VMware", + "mhz": 2300, + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": 18.04 + } + } + } + } + }, + "AzureInstance": { + "value": { + "metadata": { + "name": "instance-1", + "createTime": "2020-10-27T22:14:36.994172Z", + "description": "My Azure Instance", + "displayName": "Instance-1", + "tags": [ + "prod-1", + "dev-1" + ], + "kind": "instance", + "links": { + "rel": "/api/v1/infrastructure/locations/azure-westus2/instances/instance-1" + }, + "ref": "/infrastructure/locations/azure-westus2/instances/instance-1", + "uid": "4ed722ec-1bc0-47a1-9772-87718fa9ddb8", + "updateTime": "2020-10-27T22:14:36.994172Z" + }, + "desiredState": { + "nginx": { + "process": { + "group": "test", + "user": "testuser" + } + }, + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/azure-standard-ds1v2" + }, + "type": "AZURE_INSTANCE" + }, + "currentStatus": { + "networkConfig": { + "networkInterfaces": [ + { + "name": "my-nic-1", + "publicDnsName": "myapp.westus2.cloudapp.azure.com", + "privateIP": "10.0.1.4", + "publicIP": "52.229.16.198", + "subnet": { + "subnetID": "subnet-test", + "cidrIPv4": "10.0.1.0/24" + } + } + ] + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": "3.12.5" + }, + "hostname": "instance-1", + "instanceID": "ce266e67-42ec-41a0-b8f4-f4cd0be01828", + "legacyNginxMetadata": { + "build": "nginx-plus-r22", + "built_from_source": true, + "id": 6, + "last_seen": "2020-10-27T22:30:34.376659Z", + "pid": 1138, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "nginx-plus-r22" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": "", + "user": "nginx", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + " 11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + " 11 Sep 2018" + ] + }, + "start_time": 1603836993, + "version": "1.19.0" + }, + "legacySystemMetadata": { + "boot": 1603836911000, + "disk_partitions": [ + { + "device": "/dev/sda1", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda15", + "fstype": "vfat", + "mountpoint": "/boot/efi" + }, + { + "device": "/dev/sdb1", + "fstype": "ext4", + "mountpoint": "/mnt" + } + ], + "id": 5, + "network": { + "default": "eth0", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "10.0.1.4", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "ipv6": { + "address": "fe80::20d:3aff:fec5:3f80", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:0d:3a:c5:3f:80", + "name": "eth0" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "36608K" + }, + "cores": "1", + "cpus": "1", + "hypervisor": "Microsoft", + "mhz": "2095.191", + "model": "Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.5 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "nginx": { + "process": { + "group": "test", + "user": "testuser" + } + }, + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/azure-standard-ds1v2" + }, + "type": "AZURE_INSTANCE", + "version": "1.19.0" + } + } + }, + "OtherInstance": { + "value": { + "metadata": { + "name": "test_instance_1", + "displayName": "Test Instance 1", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified/instances/test_instance_1" + }, + "createTime": "2020-05-20T20:02:18.107875Z", + "updateTime": "2020-05-20T20:02:18.107875Z" + }, + "desiredState": { + "type": "OTHER_INSTANCE" + }, + "currentStatus": { + "type": "OTHER_INSTANCE", + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "status": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": "999.0.0-1" + }, + "hostname": "test-fab4edf8-data-1.test", + "legacyNginxMetadata": { + "build": "nginx-plus-r21", + "built_from_source": false, + "id": 2, + "last_seen": "2020-05-20T20:40:21.146894Z", + "pid": 2995, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "21-1~bionic" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": null, + "user": "nginx", + "with-cc-opt": "'-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.17.9/debian/debuild-base/nginx-plus-1.17.9=. -fstack-protector-strong -Wformat -Werror=format-security,-D_FORTIFY_SOURCE=2 -fPIC'", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ] + }, + "start_time": 1590004864000 + }, + "legacySystemMetadata": { + "boot": 1590004492000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "id": 1, + "network": { + "default": "lo", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "192.0.10.1", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "mac": "02:42:98:fb:40:48", + "name": "docker0" + }, + { + "ipv4": { + "address": "10.149.41.181", + "netmask": "255.255.240.0", + "prefixlen": 20 + }, + "ipv6": { + "address": "fe80::250:56ff:fe98:e2f1", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:50:56:98:e2:f1", + "name": "ens32" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": "1", + "cpus": "4", + "hypervisor": "VMware", + "mhz": "2300.000", + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "version": "1.17.9" + } + } + }, + "ListInstanceResponse": { + "value": { + "items": [ + { + "currentStatus": { + "agent": { + "version": "3.7.44" + }, + "hostname": "i-563457274582", + "legacyNginxMetadata": { + "build": "nginx-plus-r22", + "built_from_source": false, + "id": 2, + "last_seen": "2020-07-08T17:24:07.869745Z", + "pid": 3104, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": {}, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": "", + "user": "nginx", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "", + "11", + "Sep", + "2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "", + "11", + "Sep", + "2018" + ] + }, + "start_time": 0 + }, + "legacySystemMetadata": { + "boot": 1594225800000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "id": 1, + "network": { + "default": "", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "10.149.41.97", + "netmask": "255.255.240.0", + "prefixlen": 20 + }, + "ipv6": { + "address": "fe80::250:56ff:fe98:b512", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:50:56:98:b5:12", + "name": "ens32" + }, + { + "ipv4": { + "address": "192.0.10.1", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "mac": "02:42:24:f1:ae:8a", + "name": "docker0" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": "1", + "cpus": "4", + "hypervisor": "VMware", + "mhz": "2300.000", + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "status": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "type": "OTHER_INSTANCE", + "version": "1.19.0" + }, + "desiredState": { + "type": "OTHER_INSTANCE" + }, + "metadata": { + "createTime": "2020-07-08T16:42:07.97301Z", + "displayName": "Test Instance 1", + "kind": "instance", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified/instances/instance-1" + }, + "name": "instance-1", + "ref": "/infrastructure/locations/unspecified/instances/instance-1", + "uid": "ec8d8dac-10b6-4195-943b-1a5d65dd131c", + "updateTime": "2020-07-08T16:42:07.97301Z" + } + } + ] + } + }, + "InstanceGroupRequest": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + }, + "GetInstanceGroupResponse": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + }, + "ListInstanceGroupsResponse": { + "value": { + "items": [ + { + "currentStatus": { + "instanceRefs": [], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "us-west-2 autoscale group", + "displayName": "aws-autoscale-group", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/amz-us-west-2-as-group" + }, + "name": "amz-us-west-2-as-group", + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + }, + "ComponentRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "ingress": { + "uris": { + "/api/golf/": { + "matchMethod": "PREFIX" + } + }, + "gatewayRefs": [ + { + "ref": "/services/environments/dev/gateways/sportsgw" + } + ] + }, + "publishedApiRefs": [ + { + "ref": "/services/environments/dev/apps/sports/published-apis/golf-pub" + } + ], + "backend": { + "workloadGroups": { + "serverGrp1": { + "uris": { + "{{httpWorkloadInstance1}}": {} + } + } + }, + "monitoring": {} + }, + "security": { + "rateLimit": { + "defaultLimit": { + "rate": 1, + "rateMeasure": "SECONDS" + } + } + }, + "caching": { + "splitConfig": { + "key": "${remote_addr}${http_user_agent}${date_gmt}", + "criteriaType": "PERCENTAGE" + }, + "diskStores": [ + { + "path": "/tmp/hdd1", + "maxSize": "5G", + "minFree": "10M", + "inMemoryStoreSize": "100M", + "tempPath": "ENABLED", + "inactiveTime": "2m", + "percentCriteria": "100%", + "directoryLevel": { + "first": 1, + "mid": 2, + "last": 1 + }, + "trimPolicy": { + "maxFiles": 150, + "frequency": "100m", + "durationThreshold": "30m" + }, + "loaderPolicy": { + "maxFiles": 150, + "frequency": "100m", + "durationThreshold": "30m" + }, + "purgerPolicy": { + "maxFiles": 150, + "frequency": "100m", + "durationThreshold": "30m" + } + } + ] + } + } + } + }, + "OtherLocationRequest": { + "value": { + "metadata": { + "name": "my-other-location", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "OTHER_LOCATION" + } + } + }, + "AWSLocationRequest": { + "value": { + "metadata": { + "name": "my-aws-location", + "description": "AWS Location for us-east-1", + "displayName": "us-east-1-location", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AWS_LOCATION", + "vpcID": "vpc-1234", + "region": "us-east-1", + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + } + } + } + }, + "AzureLocationRequest": { + "value": { + "metadata": { + "name": "my-azure-location", + "description": "Azure Location for West US 2", + "displayName": "westus2-location", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_LOCATION", + "resourceGroup": "myResourceGroup", + "subscriptionID": "mySubscriptionID", + "region": "westus2", + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + } + } + } + }, + "OtherLocationResponse": { + "value": { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + }, + "AWSLocationResponse": { + "value": { + "currentStatus": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + }, + "region": "us-east-1", + "type": "AWS_LOCATION", + "vpcID": "vpc-1234" + }, + "desiredState": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + }, + "region": "us-east-1", + "type": "AWS_LOCATION", + "vpcID": "vpc-1234" + }, + "metadata": { + "createTime": "2020-05-13T16:57:02.931198Z", + "description": "AWS Location for us-east-1", + "displayName": "us-east-1-location", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-aws-location" + }, + "name": "my-aws-location", + "tags": [ + "dev", + "prod" + ], + "uid": "62f72025-59a1-4c11-8cca-798b5e12efb8", + "updateTime": "2020-05-13T16:57:02.931198Z" + } + } + }, + "AzureLocationResponse": { + "value": { + "currentStatus": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + }, + "type": "AZURE_LOCATION", + "subscriptionID": "mySubscriptionID", + "region": "westus2" + }, + "desiredState": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + }, + "type": "AZURE_LOCATION", + "subscriptionID": "mySubscriptionID", + "region": "westus2" + }, + "metadata": { + "createTime": "2020-05-13T16:57:02.931198Z", + "description": "Azure Location for West US 2", + "displayName": "westus2-location", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-azure-location" + }, + "name": "my-azure-location", + "tags": [ + "dev", + "prod" + ], + "uid": "62f72025-59a1-4c11-8cca-798b5e12efb8", + "updateTime": "2020-05-13T16:57:02.931198Z" + } + } + }, + "ListLocationResponse": { + "value": { + "items": [ + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "Location for instances where location has not been specified", + "displayName": "Unspecified (default)", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified" + }, + "name": "unspecified", + "tags": [ + "default" + ], + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + }, + "AWSRequest": { + "value": { + "metadata": { + "name": "my-instance-template", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AWS_INSTANCE_TEMPLATE", + "amiID": "ami-a0cfeed8", + "instanceType": "t2.large", + "subnetID": "subnet-12345678", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "publicKey": "my-public-key", + "associatePublicIPAddress": true + } + } + }, + "AzureRequestWithMarketplaceImageAndUsingExistingNic": { + "value": { + "metadata": { + "name": "my-azure-template-for-standard-A1", + "description": "Azure Instance Template for Standard A1", + "displayName": "Standard_A1-instance-template", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + } + } + }, + "AzureRequestWithCustomImageAndCreatingNewNicAndPublicIP": { + "value": { + "metadata": { + "name": "my-azure-template-for-standard-DS1_v2", + "description": "Azure Instance Template for Standard DS1v2", + "displayName": "DS1_v2-instance-template", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_ID", + "imageID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myCustomImageID" + }, + "instanceType": "Standard_DS1_v2", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_CONFIG", + "virtualNetwork": "my-virtual-network", + "subnet": "my-subnet", + "securityGroup": "my-network-sg", + "publicIp": true + } + } + } + }, + "AWSResponse": { + "value": { + "currentStatus": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "desiredState": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/location-1/instance-templates/my-instance-template" + }, + "name": "my-instance-template", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + }, + "AzureResponse": { + "value": { + "currentStatus": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "Azure Instance Template for Standard A1", + "displayName": "Standard_A1-instance-template", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/azure-westus2/instance-templates/my-azure-template-for-standard-A1" + }, + "name": "my-azure-template-for-standard-A1", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + }, + "AWSListResponse": { + "value": { + "items": [ + { + "currentStatus": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "desiredState": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/location-1/instance-templates/my-instance-template" + }, + "name": "my-instance-template", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + ] + } + } + }, + "responses": { + "BadRequest": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Unauthorized": { + "description": "User authentication is invalid or missing.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotFound": { + "description": "The specified instance group resource was not found.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Conflict": { + "description": "The request failed due to a conflict with an existing instance group resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotAllowed": { + "description": "The request is not allowed on the specified resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 120322, + "message": "Error deleting the location: the name 'unspecified' is reserved. Specify a different name for the location, then try again." + } + } + } + } + } + } +} diff --git a/static/nginx-controller/api/ctlr-analytics-openapi.json b/static/nginx-controller/api/ctlr-analytics-openapi.json new file mode 100644 index 000000000..10381247a --- /dev/null +++ b/static/nginx-controller/api/ctlr-analytics-openapi.json @@ -0,0 +1,2461 @@ +{ + "openapi": "3.0.3", + "info":{ + "title": "NGINX Controller Analytics REST API", + "version": "v1", + "description": "Use the NGINX Controller Analytics API to get information about your system and application performance." + }, + "servers": [ + { + "description": "NGINX Controller API", + "url": "https://{{CONTROLLER_FQDN}}/api/v1" + }], + "tags": [ + { + "name": "Alerts", + "description": "Use the Alerts API to manage the Alert Rule resources and retrieve information about the Alerts." + }, + { + "name": "Catalogs", + "description": "Use the Catalogs API to find out about the Metrics and Dimensions that you can use to refine your Analytics data queries." + }, + { + "name": "Events", + "description": "Use the Events API to retrieve information about system Events." + }, + { + "name": "Forwarders", + "description": "Use the Forwarders API to forward data (metrics, events) to external services." + }, + { + "name": "Metrics", + "description": "Use the Metrics API to retrieve system Metrics." + } + ], + "paths": { + "/analytics/alerts/rules": { + "get": { + "tags": [ + "Alerts" + ], + "summary": "List all Alert Rules", + "operationId": "listAlertRules", + "x-f5-experimental": true, + "description": "Returns a list of all the Alert Rule resources.", + "responses": { + "200": { + "description": "Successfully retrieved a list of all the Alert Rule resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Alerts" + ], + "summary": "Create an Alert Rule", + "description": "Creates a new Alert Rule resource.", + "operationId": "createAlertRule", + "x-f5-experimental": true, + "requestBody": { + "description": "Defines the Alert Rule resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Alert Rule resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/alerts/rules/{alertRuleName}": { + "parameters": [ + { + "name": "alertRuleName", + "description": "Identifies the Alert Rule resource.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "get": { + "tags": [ + "Alerts" + ], + "summary": "Get an Alert Rule", + "description": "Returns information for the specified Alert Rule.", + "operationId": "getAlertRule", + "x-f5-experimental": true, + "responses": { + "200": { + "description": "Successfully returned the requested Alert Rule resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Alerts" + ], + "summary": "Upsert an Alert Rule", + "description": "Creates a new Alert Rule or updates an existing Alert Rule resource.", + "operationId": "updateAlertRule", + "x-f5-experimental": true, + "requestBody": { + "description": "Defines the Alert Rule resource to create or the updates to make.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Alert Rule resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "201": { + "description": "Successfully created the specified Alert Rule resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertRule" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Alerts" + ], + "summary": "Delete an Alert Rule", + "description": "Deletes the specified Alert Rule resource.", + "operationId": "deleteAlertRule", + "x-f5-experimental": true, + "responses": { + "204": { + "description": "Successfully deleted the specified Alert Rule resource." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/alerts/rules/{alertRuleName}/alerts": { + "parameters": [ + { + "name": "alertRuleName", + "description": "Identifies the Alert Rule resource.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "get": { + "tags": [ + "Alerts" + ], + "summary": "Get ongoing Alerts", + "description": "Returns information about Alerts for the specified Alert Rule.", + "operationId": "getAlerts", + "x-f5-experimental": true, + "responses": { + "200": { + "description": "Successfully returned the requested Alerts.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Alert" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/alerts/rules/{alertRuleName}/alerts/{alertId}": { + "parameters": [ + { + "name": "alertRuleName", + "description": "Identifies the Alert Rule resource.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "alertId", + "description": "Identifies the Alert resource.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "get": { + "tags": [ + "Alerts" + ], + "summary": "Get Alert", + "description": "Returns information about the requested Alert for the specified Alert Rule.", + "operationId": "getAlert", + "responses": { + "200": { + "description": "Successfully returned the requested Alert.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Alert" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/catalogs/metrics": { + "get": { + "tags": [ + "Catalogs" + ], + "summary": "List the Metrics Catalog", + "operationId": "listMetricsDescriptions", + "description": "Lists all of the Metric resources in the Catalog.\n\nThe Metrics Catalog contains the definitions for all of the available NGINX and NGINX Controller Agent metrics.\nYou can use the Catalogs API to find information about the available Metrics, then use those Metrics to refine your Analytics data queries.\n", + "responses": { + "200": { + "description": "Successfully returned the Metrics Catalog list.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListMetricsDescriptionsResponse" + } + } + } + } + } + } + }, + "/analytics/catalogs/metrics/{metricName}": { + "get": { + "tags": [ + "Catalogs" + ], + "summary": "Get a Metric Description", + "operationId": "getMetricDescription", + "description": "Gets the description of the specified Metric.\n", + "parameters": [ + { + "in": "path", + "name": "metricName", + "description": "Name of the Metric resource.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Successfully returned the requested Metric resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetricDescriptionResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Metric resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/catalogs/dimensions": { + "get": { + "tags": [ + "Catalogs" + ], + "summary": "List the Dimensions Catalog", + "operationId": "listDimensionsDescriptions", + "description": "Lists all of the Dimension resources in the Catalog.\n\nDimensions provide a means of refining the data returned by metrics and events queries.\nYou can use the List Dimensions Catalog endpoint to find out what Dimensions are available.\nThen, use the Get a Dimension endpoint to find out more about a specific dimension.\n", + "responses": { + "200": { + "description": "Successfully returned the requested Dimension resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListDimensionsDescriptionsResponse" + } + } + } + } + } + } + }, + "/analytics/catalogs/dimensions/{dimensionName}": { + "get": { + "tags": [ + "Catalogs" + ], + "summary": "Get a Dimension Description", + "operationId": "getDimensionDescription", + "description": "Gets the description of the specified Dimension resource.\n", + "parameters": [ + { + "in": "path", + "name": "dimensionName", + "description": "Name of the Dimension", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Successfully returned the requested Dimension resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetDimensionDescriptionResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Dimension resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/events": { + "get": { + "tags": [ + "Events" + ], + "summary": "Get Events", + "operationId": "queryEvents", + "description": "Returns a list of system Events.", + "parameters": [ + { + "name": "startTime", + "in": "query", + "description": "Indicates the start of the time window to include Events from (inclusive).\n\n- Must be provided if `endTime` was specified.\n- If you do not set 'startTime`, the most recent 100 Events will be returned.\n- `startTime` and `endTime` can be formatted as Event IDs (UUID format). If you use this format for any boundary, the validity of that boundary (for example, if endTime is greater than startTime) will not be checked.\n", + "schema": { + "$ref": "#/components/schemas/Time" + } + }, + { + "name": "endTime", + "in": "query", + "description": "Indicates the end of the time window to include Events from (non-inclusive).\n\n- Must be greater than `startTime`.\n- Must be provided if `startTime` was specified.\n", + "schema": { + "$ref": "#/components/schemas/Time" + } + }, + { + "name": "filter", + "in": "query", + "description": "Filters results based on dimension values.\n\nConsists of one or more predicates in the form `` where:\n- `` is the name of the dimension,\n- `` is one of the supported operators (`=`, `!=`, `<`, `<=`, `>=` `>`, `in` or `not`)\n- `` is the value of the dimension(s) that you want to filter on,\n- ` and ` are case sensitive.\n\nFor example: 'count > 100'\n\nPredicates can be combined into logical expressions using `OR`, `AND`, and `(` `)`.\nFor matching values, wildcard (`*`) use is supported.\n\nWrapping predicates in single quotes is recommended to ensure that the full query string is processed correctly.\n", + "schema": { + "type": "string", + "example": "category IN ('agent','controller') AND level='debug' AND count > 100" + }, + "allowReserved": true + }, + { + "name": "orderBy", + "in": "query", + "description": "Indicates how the results will be ordered.\n\nConsists of at most three comma-separated clauses in the form `` or `` where:\n- `` is the name of the dimension.\n- `` is the order by which the specified dimension will be sorted. Valid sort order is either \"ASC\" for ascending order, or \"DESC\" for descending order. If no sort order is provided, the default one (\"ASC\") will be used.\n\nNote that if no orderBy is provided, the default combination of descending \"timestamp\" and ascending \"id\" will be used regardless. If you provide different order for \"timestamp\" or \"id\" in orderBy, the default one will be overwritten.\n", + "schema": { + "type": "string", + "example": "name ASC,timestamp DESC" + } + }, + { + "name": "page", + "in": "query", + "description": "page number", + "required": false, + "schema": { + "type": "integer", + "default": 1, + "example": 1 + } + }, + { + "name": "pageToken", + "in": "query", + "description": "Transactional token used for pagination.\n\nThe token ensures consistency of the query results across requests for various pages of data. It provides a snapshot of the database contents from the time at which the query was received.\n\nIf `pageToken` is not provided with a page request, a token is automatically generated and will be returned in the response metadata. You should include the token in subsequent requests for pages in the query results.\n\nSending a query without a `pageToken` refreshes the query results.\n", + "schema": { + "type": "string", + "example": "1573653786" + } + }, + { + "name": "pageSize", + "in": "query", + "description": "Defines the number of returned items per page.\n\n- The maximum value is 100. If value is greater, it is automatically set down to 100.\n- If `pageSize`=0, pagination is disabled and all Events will be returned in response.\n- The response size is limited to 10,000 results. If the number of results exceeds 10,000 a warning is returned.\n", + "schema": { + "type": "integer", + "default": 100, + "example": 10 + } + }, + { + "name": "includeTotal", + "in": "query", + "description": "Defines if the Metadata should include the total count of events.\n", + "schema": { + "type": "boolean", + "default": false, + "example": true + } + } + ], + "responses": { + "200": { + "description": "Successfully returned the requested Events.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EventQueryResult" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/events/{id}": { + "get": { + "tags": [ + "Events" + ], + "summary": "Get an Event", + "operationId": "queryEventsById", + "description": "Returns the specified Event.", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Identifies the Event that you want to retrieve.", + "required": true, + "schema": { + "type": "string", + "example": "00112233-4455-6677-8899-aabbccddeeff" + } + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Event.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Event" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/analytics/forwarders": { + "post": { + "tags": [ + "Forwarders" + ], + "summary": "Create a Forwarder", + "description": "Creates a new Forwarder resource.", + "operationId": "createForwarder", + "requestBody": { + "description": "Contains the desired settings for the Forwarder resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "responses": { + "202": { + "description": "The request to create a Forwarder resource succeeded. The resource will be created when the configuration is complete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "get": { + "tags": [ + "Forwarders" + ], + "summary": "Get a list of Forwarders.", + "description": "Returns a list of all Forwarder resources.", + "operationId": "listForwarders", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Forwarder resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForwarderListResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/analytics/forwarders/{forwarderName}": { + "get": { + "tags": [ + "Forwarders" + ], + "summary": "Get a Forwarder", + "operationId": "getForwarder", + "description": "Gets information about an existing Forwarder resource.", + "parameters": [ + { + "$ref": "#/components/parameters/ForwarderName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Forwarder resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Forwarders" + ], + "summary": "Create or update a Forwarder", + "description": "Creates new or updates an existing Forwarder resource.", + "operationId": "updateForwarder", + "requestBody": { + "description": "Contains the desired settings for the Forwarder resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/ForwarderName" + } + ], + "responses": { + "202": { + "description": "Successfully initialized the update process of a Forwarder resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "Forwarders" + ], + "summary": "Delete a Forwarder", + "operationId": "deleteForwarder", + "description": "Deletes a Forwarder resource.", + "parameters": [ + { + "$ref": "#/components/parameters/ForwarderName" + } + ], + "responses": { + "202": { + "description": "The request to delete a Forwarder resource succeeded. The resource is marked for deletion.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Forwarder" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/analytics/metrics": { + "get": { + "tags": [ + "Metrics" + ], + "summary": "Get Metrics", + "operationId": "queryMetrics", + "description": "Returns system Metrics data based on the query parameters provided.\n\nSupports filtering based on name and/or timestamp; aggregation over a configurable time span; and grouping by dimension.\n", + "parameters": [ + { + "name": "names", + "in": "query", + "description": "Identifies the Metrics data that you want to receive.\n\n- Provide multiple names as a comma-separated list.\n- You can provide an aggregate function for each Metric (`AVG`, `SUM`, `COUNT`, `MAX`, `MIN`, or `RATE`).\n- Combining non-aggregated and aggregated Metrics in a single query would apply any `groupBy` clause to only the latter.\n- Metrics with aggregates require the `startTime` parameter.\n", + "required": true, + "schema": { + "type": "string", + "example": "AVG(controller.agent.cpu.system),SUM(plus.upstream.bytes_rcvd)" + } + }, + { + "name": "startTime", + "in": "query", + "description": "Indicates the start of the time window to include Metrics from (inclusive).\n\n- If `startTime` is omitted, the last recorded value for the queried Metrics will be returned.\n- For aggregated Metrics, you must provide `startTime` in order to calculate the resolution.\n", + "schema": { + "$ref": "#/components/schemas/Time" + }, + "example": "now-5h" + }, + { + "name": "endTime", + "in": "query", + "description": "Indicates the end of the time window to include Metrics from (non-inclusive).\n\n- Must be greater than `startTime`.\n- If `endTime` is not specified when `startTime` is present, `endTime` defaults to the current time.\n", + "schema": { + "$ref": "#/components/schemas/Time" + } + }, + { + "name": "resolution", + "in": "query", + "description": "Changes the granularity of the returned data.\n\n- Must be a valid duration -- a string starting with a number followed by a unit of time (`y`, `M`, `w`, `d`, `h`, `m` or `s`).\n- When using a resolution, you must provide an aggregate function (or functions) in the `names` parameter and `startTime`.\n- If you do not provide a resolution, the maximum available resolution will be returned (`endTime` - `startTime`).\n", + "schema": { + "type": "string", + "example": "30s" + } + }, + { + "name": "filter", + "in": "query", + "description": "Filters results based on dimension values.\n\nConsists of one or more predicates in the form `` where:\n- `` is the name of the dimension.\n- `` is one of the supported operators (`=`, `!=`, `<`, `<=`, `>=` `>`, `in` or `not`).\n- `` is value of the dimension(s) that you want to filter on.\n- ` and ` is case sensitive.\n\nFor example: 'count > 100'\n\nPredicates can be combined into logical expressions using `OR`, `AND`, and `(` `)`.\nFor matching values, wildcard (`*`) use is supported.\n\nWrapping predicates in single quotes is recommended to ensure that the full query string is processed correctly.\n\nSee the Dimensions [Catalog](#/tags/catalogs) to find out more about Dimensions.\n", + "schema": { + "type": "string", + "example": "((app!='app1' OR app='app2') AND environment in ('aa', 'bb')) AND (tags!='*tag1*' AND interface='ens*')" + } + }, + { + "name": "groupBy", + "in": "query", + "description": "Groups the results according to the specified dimension(s).\n\n- Provide multiple dimension names as a comma-separated list.\n- All Metric names that you pass into the `names` parameter must be aggregated for the `groupBy` to work.\n", + "schema": { + "type": "string", + "example": "app,environment" + } + }, + { + "name": "seriesLimit", + "in": "query", + "description": "Sets an upper limit on the number of series returned.\nAlways returns additional series with dimension value named `all` (aggregating the values of all the metrics included in the results).\nIf the result does not include `all` stored dimensions values, the Metrics query returns series with dimension value named `other` (aggregating the values of all the metrics not included in the results).\nHas to be used along with the `orderSeriesBy` parameter.\n\n- Exactly one groupBy parameter must be provided in the query\n- Cannot be used along with `dimensions` parameter.\n", + "schema": { + "type": "integer", + "example": 25 + } + }, + { + "name": "orderSeriesBy", + "in": "query", + "description": "Sorts the results according to the order specified. \n\nUsed along with the `seriesLimit` parameter.\n", + "schema": { + "type": "string", + "example": "MAX DESC", + "default": "SUM DESC" + } + }, + { + "name": "dimensions", + "in": "query", + "description": "List of dimensions that should be returned in the response for each metric series.\n\nDimensions not specified in this parameter will be hidden in the results.\nThis might result in series having exact same dimension set, but being visible as separate.\n\nIf the `aggregation` and `groupBy` parameters are provided for a metric, any dimension provided in\nthe `dimensions` query parameter also has to be provided in the `groupBy` parameter.\n\nDimensions provided in the `groupBy` query parameter do not have to be provided in the `dimensions` query parameter.\n\n- To get a single series, provide the metric name with aggregation and the dimensions parameter with an empty value.\n- Cannot be used along with `seriesLimit`.\n", + "schema": { + "type": "string", + "example": "app,environment" + } + } + ], + "responses": { + "200": { + "description": "Successfully returned the requested Metrics data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetricQueryResult" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + } + }, + "components": { + "securitySchemes": { + "cookieAuth": { + "type": "apiKey", + "in": "cookie", + "name": "session" + } + }, + "responses": { + "BadRequest": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Unauthorized": { + "description": "User authentication is invalid or missing.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Forbidden": { + "description": "The request failed due to insufficient privileges.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Internal": { + "description": "The request cannot be processed because of an internal server error.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotFound": { + "description": "The requested resource was not found or is unavailable.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Conflict": { + "description": "The request failed due to a conflict with an existing resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + }, + "parameters": { + "ForwarderName": { + "in": "path", + "name": "forwarderName", + "schema": { + "type": "string" + }, + "required": true, + "description": "The name of the Forwarder resource.\n" + } + }, + "schemas": { + "Alert": { + "title": "alert", + "type": "object", + "properties": { + "uid": { + "type": "string", + "format": "uuid" + }, + "dimensions": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "startedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp when the Alert started." + }, + "startedValue": { + "type": "number", + "description": "Value of the metric that caused the Alert to start." + }, + "lastCheckedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp when the Alert was last checked." + }, + "lastCheckedValue": { + "type": "number", + "description": "Value of the metric when the Alert was last checked." + } + }, + "required": [ + "uid", + "dimensions", + "startedTimestamp", + "startedValue", + "lastCheckedTimestamp", + "lastCheckedValue" + ] + }, + "AlertRuleStatus": { + "title": "AlertRuleStatus", + "type": "object", + "properties": { + "alertsCount": { + "type": "integer", + "description": "Number of times an Alert for the Alert Rule has been started since creation." + }, + "status": { + "type": "string", + "enum": [ + "ok", + "ongoing" + ], + "description": "Alert Rule status:\n- `ok`: All the Alerts have expired or have never started.\n- `ongoing`: At least one Alert is currently ongoing.\n" + }, + "lastStartedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp when the Alert Rule transfered from 'ok' to 'ongoing' status." + }, + "lastExpiredTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp when the Alert Rule transfered from 'ongoing' to 'ok' status." + }, + "lastCheckedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "Timestamp of the last successful check of the Alert Rule." + } + } + }, + "AlertRule": { + "title": "AlertRule", + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "userEmail": { + "type": "string", + "format": "email", + "readOnly": true, + "description": "Email of the user who created the Alert Rule." + }, + "metric": { + "type": "string", + "description": "A valid metric from the catalog.", + "example": "upstream.network.latency.max" + }, + "aggregation": { + "type": "string", + "description": "Aggregation of the metric over the configured period of time.", + "readOnly": true + }, + "filter": { + "type": "string", + "description": "The use of filter parameter limits the metrics data samples being taken into account for Alert Rule calculation\nto those matching the filter expression.\nFilter parameter syntax works the same as for `/analytics/metrics` API.\n\n- An empty filter parameter indicates that all collected data is going to be taken into account for Alert Rule calculation\n- `filter=app='myapp' AND (env='prod' or env='dev')` indicates that only samples related to desired app/env will be taken into account\n", + "example": "((app!='app1' OR app='app2') AND environment in ('dev', 'prod')) AND (tags!='*tag1*' AND interface='ens*')" + }, + "groupBy": { + "type": "string", + "description": "When `groupBy` is provided, alerts will be triggered for each distinct group of provided dimension(s).\nGroupBy parameter syntax works the same as for `/analytics/metrics` API.\n", + "example": "app,environment" + }, + "threshold": { + "type": "number", + "description": "Threshold to which the metric value will be compared to." + }, + "operator": { + "type": "string", + "enum": [ + "ge", + "le" + ], + "description": "Operator that defines which metric values will trigger an alert:\n\n- `ge`: metric value must be greater than or equal to the threshold in order to trigger an alert\n- `le`: metric value must be less than or equal to the threshold in order to trigger an alert\n" + }, + "period": { + "type": "string", + "example": "1h", + "description": "Period from which the metric aggregated value is calculated.\n\nMust be a valid duration - a string starting with a number followed by a unit of time (`h`, `m` or `s`).\n\n24h is the maximum allowed period.\n" + }, + "notificationType": { + "description": "Defines how notifications about triggered Alerts will be delivered to the user.", + "type": "string", + "enum": [ + "email" + ] + }, + "emailAddresses": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "format": "email", + "example": "user@example.com" + } + }, + "mute": { + "type": "boolean", + "description": "Indicates if the Alert Rule is muted. (Muted Alert Rules will not trigger notifications).", + "default": false + }, + "status": { + "$ref": "#/components/schemas/AlertRuleStatus", + "readOnly": true + } + }, + "required": [ + "metadata", + "metric", + "threshold", + "operator", + "period" + ] + }, + "SelfLinks": { + "type": "object", + "description": "The SelfLinks object contains a link from the resource to itself.\nThis object is used only in responses.\n", + "properties": { + "rel": { + "type": "string", + "example": "/api/v1/services/environments/prod", + "description": "`rel` contains the complete path fragment of a URI and can be used\nto construct a query to the object.\n" + } + } + }, + "ResourceMeta": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\*\\\"\\[\\]\\{\\}\\\\\\/%\\?:=&\\~\\^|#<>]+$", + "not": { + "type": "string", + "enum": [ + ".", + ".." + ] + }, + "minLength": 1, + "maxLength": 1024, + "example": "resource-name", + "description": "Resource name is a unique identifier for a resource within the context of a namespace.\nResource names must conform to [RFC 1738 Section 2.2](https://www.ietf.org/rfc/rfc1738.txt) and have a valid syntax for email addresses. The following rules are enforced:\n\n- do not utilize URL encoding;\n- do not include spaces;\n- do not use uppercase characters, for example, 'A-Z'; extended character sets are supported;\n- do not use the following characters: `\"`, `*`, `:`, `;`, `/`, `\\`, `%`, `?`, `hash`, `=`, `&`, `|`, `~`, `^`, `{`, `}`, `[`, `]`, `<`, `>`;\n- cannot start or end with an `@` sign;\n- cannot be only `.` or `..`\n\nFor example: For a collection resource located at\n\n`https://controller.example.com/api/v1/services/apps/shopping_@1`\n\nthe resource name is \"shopping_@1\".\n" + }, + "displayName": { + "type": "string", + "example": "My Display Name", + "description": "`displayName` is a user friendly resource name. It can be used to define \na longer, and less constrained, name for a resource.\n\nDisplay names:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "description": { + "type": "string", + "example": "This is a sample description string. It provides information about the resource.", + "description": "`description` is a free-form text property. You can use it to provide information that helps \nto identify the resource.\n\nDescriptions:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "kind": { + "type": "string", + "example": "-", + "description": "Kind is a string representation of an API resource's data type.\nIt is assigned by the server and cannot be changed. \n\nWhen creating a `kind`, the server uses hyphens to connect word segments; \nsingleton and collection item resources are not pluralized.\n" + }, + "uid": { + "type": "string", + "format": "uuid", + "example": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "description": "Unique Identifier (UID)\n\nUID is a unique identifier in time and space for a resource. \nWhen you create a resource, the server assigns a UID to the resource.\n\nRefer to [IETF RFC 4122](https://tools.ietf.org/html/rfc4122) for more information.\n" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ], + "description": "You can assign `tags` to a resource as a way to help map, scope, \nand organize resources. \n\nThe system uses tag selectors to specify selection criteria that \nmatch resources that have particular tags.\n" + }, + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "The `ref` field contains a reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/SelfLinks" + }, + "createTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was created.\n\nCreate time is not guaranteed to be set in \"happens-before\" order\nacross separate operations.\n\nIn JSON format, `create_time` type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n\nCreate Time is assigned by the server and cannot be changed.\n" + }, + "updateTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was last modified.\n\nResources that have never been updated do not have an `update_time` stamp.\n\nThe default value for resources that have never been updated is the local \nlanguage-specific equivalent of \"null\".\n\nIn JSON format, `update_time` type is encoded as a string as described in \n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n" + } + } + }, + "ErrorDetail": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "example": "Error doing : . This can lead to . Try to resolve the issue.", + "description": "A detailed error message returned by the server. \n\nThese messages contain the following information, where applicable:\n\n- What happened.\n- Why it happened.\n- What the consequences are (if any).\n- Recommended action to take to resolve the issue.\n" + } + } + }, + "ErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string", + "example": "Error doing .", + "description": "A human-readable message, in English, that describes the error.\n" + }, + "code": { + "type": "integer", + "example": 1234567, + "description": "A numeric error code that can be used to identify errors for support purposes.\n" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorDetail" + } + } + } + }, + "Time": { + "description": "Indicates a point in time.\n\nYou can provide time using ISO 8601 format or as an offset. An offset is a string that starts with `+` or `-`, followed by a number and a unit of time (`y`, `M`, `w`, `d`, `h`, `m` or `s`).\nExamples: \"2019-08-07T09:57:36.088757764Z\", \"now-3h\"\n", + "type": "string", + "example": "2019-08-07T09:57:36.088757764Z" + }, + "MetricQueryResult": { + "type": "object", + "properties": { + "queryMetadata": { + "$ref": "#/components/schemas/MetricQueryMetadata" + }, + "metrics": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metric" + } + }, + "responseMetadata": { + "$ref": "#/components/schemas/MetricResponseMetadata" + } + } + }, + "MetricResponseMetadata": { + "type": "object", + "properties": { + "warning": { + "type": "string" + } + } + }, + "MetricQueryMetadata": { + "type": "object", + "properties": { + "startTime": { + "type": "string", + "format": "date-time", + "example": "2019-08-07T09:57:36.088757764Z" + }, + "endTime": { + "type": "string", + "format": "date-time", + "example": "2019-08-07T09:57:36.088757764Z" + }, + "resolution": { + "type": "string", + "example": "30m" + } + } + }, + "Metric": { + "type": "object", + "description": "Metrics provide a means of measuring and analyzing the performance of your systems and of NGINX Controller.", + "properties": { + "name": { + "type": "string", + "example": "plus.upstream.response.count" + }, + "aggr": { + "type": "string", + "enum": [ + "AVG", + "COUNT", + "SUM", + "MAX", + "MIN", + "RATE" + ], + "example": "AVG" + }, + "series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Series" + } + } + } + }, + "Series": { + "type": "object", + "properties": { + "dimensions": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "example": { + "app": "app1", + "env": "prod" + } + }, + "timestamps": { + "type": "array", + "items": { + "type": "string", + "format": "date-time" + }, + "example": [ + "2019-08-07T09:57:30", + "2019-08-07T09:57:35" + ] + }, + "values": { + "type": "array", + "items": { + "type": "number" + }, + "example": [ + 4.2, + 4.4 + ] + } + } + }, + "ListMetricsDescriptionsResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MetricDescriptionRecord" + } + } + } + }, + "MetricDescriptionResponse": { + "$ref": "#/components/schemas/MetricDescriptionRecord" + }, + "MetricDescriptionRecord": { + "type": "object", + "required": [ + "metadata", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/MetricDescription" + } + } + }, + "MetricDescription": { + "type": "object", + "description": "The information record for a Metrics Catalog resource.", + "properties": { + "name": { + "type": "string", + "example": "nginx.http.request.bytes_sent" + }, + "description": { + "type": "string", + "example": "Number of bytes sent to clients." + }, + "unit": { + "type": "string", + "example": "bytes" + }, + "aggregations": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "AVG", + "COUNT", + "SUM", + "MAX", + "MIN" + ] + }, + "example": [ + "AVG", + "SUM" + ] + }, + "type": { + "type": "string", + "enum": [ + "counter", + "gauge", + "incremental" + ], + "example": "incremental" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "nginx", + "apimgmt_environment", + "apimgmt_definition", + "apimgmt_entry_point" + ], + "description": "An array of freeform strings containing the category(ies) of a Metrics Catalog resource." + }, + "dimensions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + }, + "description": "An array of the Dimensions that apply to a Metrics Catalog resource." + } + } + }, + "ListDimensionsDescriptionsResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DimensionDescriptionRecord" + } + } + } + }, + "GetDimensionDescriptionResponse": { + "$ref": "#/components/schemas/DimensionDescriptionRecord" + }, + "DimensionDescriptionRecord": { + "type": "object", + "required": [ + "metadata", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/DimensionDescription" + } + } + }, + "DimensionDescription": { + "type": "object", + "description": "The information record for a Dimensions Catalog resource.", + "properties": { + "name": { + "type": "string", + "example": "instance" + }, + "description": { + "type": "string", + "example": "Instance name." + }, + "type": { + "type": "string", + "enum": [ + "string", + "int", + "list" + ], + "example": "string" + }, + "metrics": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + }, + "description": "An array of the Metrics that the Dimensions resource applies to." + } + } + }, + "NamedLinks": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfLinks" + }, + { + "type": "object", + "description": "Contains information about the object being referred to.\n\nThese are generally details -- like the object name and display name --\nthat are useful to a consumer of the API that performs further\nprocessing. \n\nThis object is only present in responses.\n \n", + "properties": { + "name": { + "type": "string", + "example": "production", + "description": "The name of the linked resource.\n" + }, + "displayName": { + "type": "string", + "example": "Production Environment", + "description": "A user friendly resource name." + } + } + } + ] + }, + "ResourceRef": { + "type": "object", + "required": [ + "ref" + ], + "properties": { + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "A reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "EventQueryResult": { + "type": "object", + "properties": { + "Metadata": { + "$ref": "#/components/schemas/Metadata" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Event" + } + } + } + }, + "Event": { + "type": "object", + "description": "An Event is a system message.", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "example": "2019-08-07T09:57:36.088757764Z" + }, + "id": { + "type": "string", + "format": "uuid", + "example": "00112233-4455-6677-8899-aabbccddeeff" + }, + "message": { + "type": "string", + "example": "nginx stub_status detected, https://127.0.0.1:443/basic_status" + }, + "count": { + "type": "integer", + "example": 99 + }, + "category": { + "type": "string" + }, + "level": { + "type": "string", + "enum": [ + "DEBUG", + "INFO", + "WARNING", + "ERROR", + "CRITICAL" + ], + "example": "INFO" + }, + "hostname": { + "type": "string", + "example": "d0784771a503" + }, + "alias": { + "type": "string", + "example": "my_system" + }, + "status": { + "type": "string", + "example": "success" + }, + "error": { + "type": "string" + }, + "local_id": { + "type": "string", + "example": "d23c85484ee760ee5f4619c0434e1968b5290964487541da0889964eb783613c" + }, + "root_uuid": { + "type": "string", + "example": "759e842f6b9f51a7803f57da1e9f5ae8" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": "[\"tag1\", \"tag2\"]" + }, + "instance": { + "type": "string", + "example": "2" + }, + "location": { + "type": "string", + "example": "unspecified" + }, + "correlationId": { + "type": "string", + "example": "e5f355e4de82edd0afcd74ef6c1ee6aa" + }, + "http.request_endpoint": { + "type": "string", + "example": "/services/environments/dev/apps/app/components/25" + }, + "http.request_method": { + "type": "string", + "example": "POST" + }, + "user": { + "type": "string", + "example": "admin@nginx.test" + }, + "environment": { + "type": "string", + "example": "dev-environment" + }, + "app": { + "type": "string", + "example": "finance-app" + }, + "component": { + "type": "string", + "example": "secure-component" + }, + "gateway": { + "type": "string", + "example": "dev-gateway" + }, + "request_outcome": { + "type": "string", + "enum": [ + "REJECTED", + "PASSED" + ], + "example": "REJECTED" + }, + "request_outcome_reason": { + "type": "string", + "enum": [ + "SECURITY_WAF_OK", + "SECURITY_WAF_VIOLATION", + "SECURITY_WAF_FLAGGED", + "SECURITY_WAF_BYPASS", + "SECURITY_NGINX_VIOLATION", + "SECURITY_WAF_VIOLATION_TRANSPARENT" + ], + "example": "SECURITY_WAF_FLAGGED" + }, + "http.response_code": { + "type": "integer", + "example": 200 + }, + "http.hostname": { + "type": "string", + "example": "itay-108-117.f5net.com" + }, + "http.remote_addr": { + "type": "string", + "example": "127.0.0.1" + }, + "http.remote_port": { + "type": "integer", + "example": 4000 + }, + "http.server_addr": { + "type": "string", + "example": "0.0.0.0" + }, + "http.server_port": { + "type": "integer", + "example": 80 + }, + "http.request": { + "type": "string", + "example": "GET /test.exe HTTP/1.1\\r\\nUser-Agent: curl/7.29.0\\r\\nHost: localhost\\r\\nAccept: */*\\r\\n" + }, + "waf.support_id": { + "type": "string", + "example": "161339000577578694" + }, + "waf.signature_ids": { + "type": "string", + "example": "200001475,200000098" + }, + "waf.policy": { + "type": "string", + "example": "/Common/policy1" + }, + "waf.attack_types": { + "type": "string", + "example": "Non-browser Client,Abuse of Functionality,Cross Site Scripting (XSS)" + }, + "waf.violation_rating": { + "type": "string", + "enum": [ + "RISK_COULD_NOT_BE_DETERMINED", + "POSSIBLE_ATTACK", + "MOST_LIKELY_ATTACK" + ], + "example": "MOST_LIKELY_ATTACK" + }, + "waf.signature_names": { + "type": "string", + "example": "XSS script tag end (Parameter) (2),XSS script tag (Parameter)" + }, + "waf.is_truncated": { + "type": "string", + "example": "true" + }, + "waf.signature_cves": { + "type": "string", + "example": "CVE-2017-8759,CVE-2015-1641" + }, + "waf.sub_violations": { + "type": "string", + "example": "HTTP protocol compliance failed:Host header contains IP address" + }, + "waf.violations": { + "type": "string", + "example": "HTTP protocol compliance failed,Illegal meta character in value,Attack signature detected" + }, + "waf.x_forwarded_for_header_value": { + "type": "string", + "example": "87.233.120.158" + }, + "waf.bot_anomalies": { + "type": "string", + "example": "Search Engine Verification Failed" + }, + "waf.bot_category": { + "type": "string", + "example": "Search Engine" + }, + "waf.bot_client_class": { + "type": "string", + "example": "Malicious Bot" + }, + "waf.bot_signature_name": { + "type": "string", + "example": "Google" + }, + "waf.enforced_bot_anomalies": { + "type": "string", + "example": "Search Engine Verification Failed" + }, + "action_type": { + "type": "string", + "example": "login" + }, + "action_outcome": { + "type": "string", + "example": "success" + }, + "auth_provider.name": { + "type": "string", + "example": "local" + }, + "auth_provider.type": { + "type": "string", + "example": "BASIC" + }, + "resource_name": { + "type": "string", + "example": "datadog-forwarder" + }, + "big_ip_address": { + "type": "string", + "example": "https://87.233.120.158" + }, + "workload_health_state": { + "type": "string", + "example": "unhealthy" + } + } + }, + "Metadata": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/components/schemas/MetadataPagination" + } + } + }, + "MetadataPagination": { + "type": "object", + "required": [ + "pageToken" + ], + "properties": { + "pageToken": { + "type": "string", + "example": "1594048781" + }, + "links": { + "$ref": "#/components/schemas/PaginationLinks" + }, + "total": { + "type": "integer", + "example": 3600 + } + } + }, + "PaginationLinks": { + "type": "object", + "properties": { + "next": { + "$ref": "#/components/schemas/SelfLinks" + }, + "prev": { + "$ref": "#/components/schemas/SelfLinks" + } + } + }, + "Forwarder": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/DesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/CurrentStatus" + } + }, + "example": { + "metadata": { + "name": "splunk", + "displayName": "Splunk - Metrics", + "description": "Metrics forwarder going to Splunk HEC", + "kind": "forwarder", + "uid": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "links": { + "rel": "/api/v1/analytics/forwarders/splunk" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T10:12:33.001Z" + }, + "desiredState": { + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/new_splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + }, + "currentStatus": { + "state": { + "selfConfigState": { + "isConfigured": false, + "isConfiguring": true, + "isError": false, + "isDeleting": false, + "total": 1, + "configured": 0, + "configuring": 1, + "error": 0, + "deleting": 0 + } + }, + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + } + } + }, + "CurrentStatus": { + "type": "object", + "required": [ + "integrationRef", + "streams", + "state", + "collectorType" + ], + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "integrationRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "collectorType": { + "type": "string", + "enum": [ + "DATADOG", + "SPLUNK", + "SYSLOG", + "OTLP_HTTP", + "OTLP_GRPC" + ], + "description": "The type of Collector receiving forwarded data. The parameter sets the communication protocol\nand how the Forwarder monitors the liveness of the Collector.\n" + }, + "streams": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ForwarderStream" + } + } + } + }, + "DesiredState": { + "type": "object", + "required": [ + "integrationRef", + "streams", + "collectorType" + ], + "properties": { + "integrationRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "collectorType": { + "type": "string", + "enum": [ + "DATADOG", + "SPLUNK", + "SYSLOG" + ], + "description": "The type of Collector receiving forwarded data. The parameter sets the communication protocol\nand how the Forwarder monitors the liveness of the Collector.\n" + }, + "streams": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ForwarderStream" + } + } + } + }, + "ForwarderStream": { + "type": "object", + "required": [ + "outputFormat", + "inputDataType", + "selector" + ], + "description": "There is no global limitation on number of streams.\n\nWhen creating a Stream, be sure that the metrics you select are not already included in an existing Stream.\nWhen you add the same metrics to multiple Streams -- which is known as \"overlapping Streams\" -- you may see significant performance degradation and data duplication. The duplicated data may not be interpreted correctly by the Collector.\n", + "properties": { + "outputFormat": { + "type": "string", + "enum": [ + "SPLUNK", + "DATADOG", + "SYSLOG", + "OTLP" + ], + "description": "The format in which you want to send data to the Collector.\n", + "example": "SPLUNK" + }, + "inputDataType": { + "type": "string", + "enum": [ + "METRICS", + "EVENTS" + ], + "description": "The type of data that the stream is processing.", + "example": "METRICS" + }, + "selector": { + "type": "string", + "description": "The selector object limits the amount of data sent from NGINX Controller to the desired Collector.\nThe format of this parameter depends on the `inputDataType` value (either `METRICS` or `EVENTS`).\nAn empty selector indicates that all collected data is going to be forwarded to the Collector.\nEnsure sending all your data out of NGINX Controller does not cause additional charges.\n\n\nSelector elements and rules for `inputDataType`=`METRICS`:\nAllowed parameters: `excluded_names`, `names`, `filter`. The `filter` parameter and its behavior is not specific to `METRICS` `inputDataType`.\n\n`excluded_names` parameter consists of zero or more metric names that should not be forwarded\n`names` parameter consists of zero or more metric names that should be forwarded\nThe specific rules for these parameters are as follows:\n- if no value is provided or the only value is a wildcard (`*`), then all metric names will be forwarded.\n- if an explicit list of metric names is provided, all of these metrics will be forwarded.\n- any metric name can contain wildcard (`*`) character(s), in which case it will be resolved to all valid metrics that match the pattern.\n- `excluded_names` can be composed of metrics names and a wildcard (`*`) which should not be forwarded\n- any metric resolved from a `names` wildcard can be removed by an explicit or wildcard metric from `excluded_names`\n- any metric provided explicitly (full name without a wildcard) in the `names` parameter cannot be excluded by\n a wildcard or an explicit metric from the `excluded_names` parameter. That is, `names=system.cpu.idle&excluded_names=system.*`\n results in an error\n- `excluded_names` parameter is always applied after the resolution of the metrics from `names` parameter\n\nMake sure that all metrics provided in the `names` and `excluded_names` parameters resolve to an existing catalog metric or metrics.\n\nSample use:\n- `names=http.request.count, http.request.bytes_sent` indicates that only samples of those two metrics will be forwarded\n- `filter=app='myapp' & (env='prod' or env='dev')` indicates that only samples related to desired app/env will be forwarded,\nalso objects that does not contain filtered dimensions won't be sent\n- `names=http.request.count, http.request.bytes_sent&filter=app='myapp' AND (env='prod' or env='dev')` combines both above\n- `excluded_names=nginx.http.request.*` all metrics except matching `http.request.*` will be forwarded\n- `excluded_names=nginx.http.request.time.*&names=nginx.http.request.*` `excluded_names` can be combined\n with the `names` parameter to exclude metrics that were selected with a wildcard in the `names` parameters\n\n\nFiltering rules for `inputDataType`=`EVENTS`:\nAllowed parameters: `filter`. The `filter` parameter and its behavior is not specific to `EVENTS` `inputDataType`.\n\n\nFilter parameter:\nFilter parameter is shared between all supported data types and has the same behavior when used with any of them.\nIt consists of one or more predicates in the form `` where:\n- `` is the name of the dimension,\n- `` is one of the supported operators (`=`, `!=`, `<`, `<=`, `>=` `>`, `in` or `not`),\n- `` is value of the dimension(s) that you want to filter on,\n- ` and ` is case sensitive.\n\nFor example: 'count > 100'.\nPredicates can be combined into logical expressions using `OR`, `AND`, and `(` `)`.\nWrapping predicates in single quotes is recommended to ensure that the full query string is processed correctly.\n\nFor matching values, wildcard (`*`) use is supported.\n\nMake sure that all dimensions provided in the `filter` parameters resolve to an existing catalog dimension.\n\nAny expression with dimension not present in filtered metric/event will evaluate to `false`. This enables user\nto create filter which will forward metric/event with dimension not valid for particular metric/event but as whole filter expression\nwill evaluate to true and only parts will evaluate to false. Example:\n- `filter=file_path='/etc/hosts' OR instance='instance_name'` will forward `http.request.body_bytes_sent` as `file_path` dimension is invalid but whole expression will evaluate to true\n- `filter=file_path='/etc/hosts' AND instance='instance_name'` will not forward `http.request.body_bytes_sent` as `file_path` dimension is invalid and whole expression will always evaluate to false, but will forward `sytem.disk.used` which has both dimensions\n", + "example": "names=http.request.count,http.request.*,*latency*&filter=((app!='app1' OR app='app2') AND environment in ('aa', 'bb')) AND (tags!='*tag1*' AND interface='ens*')" + } + } + }, + "ForwarderListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Forwarder" + }, + "description": "List of Forwarder resources." + } + }, + "example": { + "items": [ + { + "metadata": { + "name": "splunk", + "displayName": "Splunk - Metrics", + "description": "Metrics forwarder going to Splunk HEC", + "kind": "forwarder", + "uid": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "links": { + "rel": "/api/v1/analytics/forwarders/splunk" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T10:12:33.001Z" + }, + "desiredState": { + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count" + } + ] + }, + "currentStatus": { + "state": { + "selfConfigState": { + "isConfigured": true, + "isConfiguring": false, + "isError": false, + "isDeleting": false, + "total": 1, + "configured": 1, + "configuring": 0, + "error": 0, + "deleting": 0 + }, + "conditions": [ + { + "type": "error", + "message": "integration reference not found" + } + ] + }, + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + } + }, + { + "metadata": { + "name": "splunk", + "displayName": "Splunk - Metrics", + "description": "Metrics forwarder going to Splunk HEC", + "kind": "forwarder", + "uid": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "links": { + "rel": "/api/v1/analytics/forwarders/splunk" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T10:12:33.001Z" + }, + "desiredState": { + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + }, + "currentStatus": { + "state": { + "selfConfigState": { + "isConfigured": true, + "isConfiguring": false, + "isError": false, + "isDeleting": false, + "total": 0, + "configured": 1, + "configuring": 0, + "error": 0, + "deleting": 0 + }, + "conditions": [ + { + "type": "error", + "message": "integration reference not found" + } + ] + }, + "collectorType": "SPLUNK", + "integrationRef": { + "ref": "/platform/integrations/splunk_hec" + }, + "streams": [ + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.bytes_rcvd&filter=app='myapp'" + }, + { + "inputDataType": "METRICS", + "outputFormat": "SPLUNK", + "selector": "names=http.request.count&filter=app='myapp'" + } + ] + } + } + ] + } + }, + "ConfigStateTally": { + "type": "object", + "properties": { + "isConfigured": { + "type": "boolean", + "description": "The configuration operation is complete." + }, + "isConfiguring": { + "type": "boolean", + "description": "The configuration of the resource, or of its child(ren), is in process." + }, + "isError": { + "type": "boolean", + "description": "An error occurred while configuring the resource or its child(ren)." + }, + "isDeleting": { + "type": "boolean", + "description": "A delete operation is in progress for the resource or its child(ren)." + }, + "total": { + "type": "integer", + "description": "The total number of resources to which the configuration operation applies." + }, + "configured": { + "type": "integer", + "description": "The number of resources that have a complete and valid configuration." + }, + "configuring": { + "type": "integer", + "description": "The number of resources that are in the process of being configured." + }, + "error": { + "type": "integer", + "description": "The number of resources that have encountered an error during the configuration process." + }, + "deleting": { + "type": "integer", + "description": "The number of resources that are in the process of being deleted." + } + } + }, + "ConfigCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The condition type." + }, + "message": { + "type": "string", + "description": "A human-readable message that provides additional information about the configuration operation." + } + } + }, + "ConfigState": { + "type": "object", + "description": "A representation of the resource's current configuration state \nthat comprises the status of the resource itself (`selfConfigState`) and any child \nresources (`childrenConfigState`).\n\nThe conditions array provides additional information during configuration changes.\n", + "properties": { + "selfConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "childrenConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigCondition" + } + } + } + } + } + } +} diff --git a/static/nginx-controller/api/ctlr-apim-openapi.json b/static/nginx-controller/api/ctlr-apim-openapi.json new file mode 100644 index 000000000..d9deeb66e --- /dev/null +++ b/static/nginx-controller/api/ctlr-apim-openapi.json @@ -0,0 +1,12547 @@ +{ + "openapi": "3.0.3", + "info":{ + "title": "NGINX Controller API Management REST API", + "version": "v1", + "description": "Manage the NGINX Controller APIM module." + }, + "servers": [ + { + "description": "NGINX Controller API", + "url": "https://{{CONTROLLER_FQDN}}/api/v1" + }], + "tags": [ + { + "name": "Instances", + "description": "Use the Instances API to manage NGINX Controller Instance resources." + }, + { + "name": "API Definitions", + "description": "Use the \"API Definitions\" API to manage your APIs by using the NGINX Controller API Management module." + }, + { + "name": "Environments", + "description": "Use the Environments API to manage your Application Environments." + }, + { + "name": "Services", + "description": "Use the Services API to request a metadata list of a desired resource within a single environment or across all environments.\nSupported resources:\n - published-apis\n" + }, + { + "name": "DevPortals", + "description": "Use the DevPortals API to manage DevPortals resources." + }, + { + "name": "Instance Groups", + "description": "Use the Instance Groups API to manage a set of instances that can be used for scaling and high availability." + }, + { + "name": "Identity Providers", + "description": "Use the Identity Provider API to manage Identity providers in the API-M Credential Management partition." + }, + { + "name": "Certs", + "description": "Use the Certs API to manage the certificates used to secure your App traffic." + }, + { + "name": "Gateways", + "description": "Use the Gateways API to manage Gateway resources." + }, + { + "name": "Error Sets", + "description": "Use the Error Sets API to view the default predefined Error Sets." + }, + { + "name": "Published APIs", + "description": "Use the Published APIs API to manage your APIs by using the API Management module." + }, + { + "name": "Components", + "description": "Use the Components API to define child components (for example, microservices) for your Apps." + }, + { + "name": "Locations", + "description": "Use the Locations API to manage the deployment locations for NGINX Controller." + }, + { + "name": "Instance Templates", + "description": "Use the Instance Templates API to manage templates that can be used to deploy new NGINX Plus instances." + }, + { + "name": "Apps", + "description": "Use the Apps API to manage App resources." + }, + { + "name": "Integrations", + "description": "Use the Integrations API to manage integrated cloud provider accounts." + }, + { + "name": "Policies", + "description": "Use the Policies API to manage the policies used to secure your App traffic." + } + ], + "paths": { + "/infrastructure/instance-groups": { + "get": { + "tags": [ + "Instance Groups" + ], + "summary": "List Instance Groups", + "description": "Returns an unfiltered list of all Instance Group resources.", + "operationId": "listInstanceGroups", + "responses": { + "200": { + "description": "Successfully retieved a list of all the configured Instance Groups.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceGroupsResponse" + }, + "example": { + "value": { + "items": [ + { + "currentStatus": { + "instanceRefs": [], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "us-west-2 autoscale group", + "displayName": "aws-autoscale-group", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/amz-us-west-2-as-group" + }, + "name": "amz-us-west-2-as-group", + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Instance Groups" + ], + "summary": "Create an Instance Group", + "description": "Creates an new Instance Group resource.", + "operationId": "addInstanceGroup", + "requestBody": { + "description": "Defines the Instance Group resource to be added.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + }, + "example": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + } + } + } + }, + "responses": { + "202": { + "description": "The Instance Group resource has been accepted for creation. The Instance Group will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/instance-groups/{instanceGroupName}": { + "get": { + "tags": [ + "Instance Groups" + ], + "summary": "Get an Instance Group", + "description": "Returns information about a specified Instance Groupe resource.", + "operationId": "getInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Instance Group resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Instance Groups" + ], + "summary": "Upsert an Instance Group", + "description": "Creates a new Instance Group resource or updates an existing Instance Group resource.", + "operationId": "upsertInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + }, + "example": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "The Instance Group resource has been accepted for creation or update.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceGroupResponse" + }, + "example": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "delete": { + "tags": [ + "Instance Groups" + ], + "summary": "Delete an Instance Group", + "description": "Deletes the specified Instance Group resource.", + "operationId": "deleteInstanceGroup", + "parameters": [ + { + "$ref": "#/components/parameters/InstanceGroupName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Instance Group resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations": { + "get": { + "tags": [ + "Locations" + ], + "summary": "List all Locations", + "description": "Returns a list of all Locations.", + "operationId": "listLocations", + "responses": { + "200": { + "description": "Successfully retrieved a list of all of the configured Locations.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListLocationResponse" + }, + "example": { + "value": { + "items": [ + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "Location for instances where location has not been specified", + "displayName": "Unspecified (default)", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified" + }, + "name": "unspecified", + "tags": [ + "default" + ], + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Locations" + ], + "summary": "Create a Location", + "description": "Creates a new Location resource.", + "operationId": "addLocation", + "requestBody": { + "description": "Defines the Location resource to be added.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Location" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationRequest" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationRequest" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}": { + "get": { + "tags": [ + "Locations" + ], + "summary": "Get a Location", + "description": "Returns information about a specified Location resource.", + "operationId": "getLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Locations" + ], + "summary": "Upsert a Location", + "description": "Creates a new Location resource or updates an existing Location resource.", + "operationId": "upsertLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Location" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationRequest" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationRequest" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationRequest" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "201": { + "description": "Successfully updated the specified Location resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLocationResponse" + }, + "examples": { + "OTHER_LOCATION": { + "$ref": "#/components/examples/OtherLocationResponse" + }, + "AWS_LOCATION": { + "$ref": "#/components/examples/AWSLocationResponse" + }, + "AZURE_LOCATION": { + "$ref": "#/components/examples/AzureLocationResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + } + } + }, + "delete": { + "tags": [ + "Locations" + ], + "summary": "Delete a Location", + "description": "Deletes the specified Location resource.", + "operationId": "deleteLocation", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Location resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "405": { + "$ref": "#/components/responses/NotAllowed" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}/instances": { + "get": { + "tags": [ + "Instances" + ], + "summary": "List all Instances in a Location", + "description": "Returns the status and metadata for all of the Instances in the specified Location.", + "operationId": "listInstances", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully returned the status and metadata for all of the Instances in the specified Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceResponse" + }, + "examples": { + "INSTANCES": { + "$ref": "#/components/examples/ListInstanceResponse" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Instances" + ], + "summary": "Create an Instance", + "description": "Creates a new Instance resource.", + "operationId": "createInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + }, + "examples": { + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstanceRequest" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstanceRequest" + } + } + } + } + }, + "responses": { + "202": { + "description": "The Instance resource has been accepted for creation. The Instance will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + } + } + } + } + }, + "400": { + "description": "Bad input parameter or URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error creating the instance: could not parse the request payload. Check the format of the request, then try again.", + "code": 120647 + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing Instance resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error creating the instance: the instance already exists. Use a unique name for the instance, then try again.", + "code": 120652 + } + } + } + } + } + } + }, + "/infrastructure/locations/{locationName}/instances/{instanceName}": { + "get": { + "tags": [ + "Instances" + ], + "summary": "Get an Instance", + "description": "Returns the status and metadata for a single Instance.", + "operationId": "getInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "responses": { + "200": { + "description": "Successfully returned the details for an Instance.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/OtherInstance" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstance" + } + } + } + } + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error getting the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120603 + } + } + } + } + } + }, + "put": { + "tags": [ + "Instances" + ], + "summary": "Update an Instance", + "description": "Updates the description or display name of an existing Instance.", + "operationId": "updateInstance", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/InstanceUpdateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the existing Instance.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + }, + "examples": { + "OTHER_INSTANCE": { + "$ref": "#/components/examples/OtherInstance" + }, + "AWS_INSTANCE": { + "$ref": "#/components/examples/AWSInstance" + }, + "AZURE_INSTANCE": { + "$ref": "#/components/examples/AzureInstance" + } + } + } + } + }, + "400": { + "description": "Bad input parameter or URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error updating the instance: could not parse the request payload. Check the format of the request, then try again.", + "code": 120612 + } + } + } + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error updating the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120614 + } + } + } + } + } + }, + "delete": { + "tags": [ + "Instances" + ], + "summary": "Delete an Instance", + "operationId": "deleteInstance", + "description": "Deletes the specified Instance.", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceName" + } + ], + "responses": { + "202": { + "description": "Request for delete accepted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceResponse" + } + } + } + }, + "204": { + "description": "Successfully deleted the Instance. No content is returned." + }, + "404": { + "description": "Instance not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error deleting the instance: the specified instance does not exist. Check the instance name, then try again.", + "code": 120609 + } + } + } + }, + "409": { + "description": "Failed to delete the requested Instance resource.\n\nThe Instance is referenced by another resource. Remove the references to the Instance, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error deleting the instance: the NGINX instance is being configured. Try again later. If the problem persists, contact the system administrator.", + "code": 120640 + } + } + } + } + } + } + }, + "/infrastructure/locations/{locationName}/instance-templates": { + "get": { + "tags": [ + "Instance Templates" + ], + "summary": "List Instance Templates", + "description": "Returns an unfiltered list of all Instance Template resources in the specified Location.", + "operationId": "listInstanceTemplates", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved a list of all Instance Template resources for the specified Location.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListInstanceTemplateResponse" + }, + "examples": { + "INSTANCE_TEMPLATES": { + "$ref": "#/components/examples/AWSListResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Instance Templates" + ], + "summary": "Create an Instance Template", + "description": "Creates a new Instance Template resource.", + "operationId": "addInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + } + ], + "requestBody": { + "description": "Defines the Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceTemplate" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSRequest" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureRequestWithMarketplaceImageAndUsingExistingNic" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/infrastructure/locations/{locationName}/instance-templates/{instanceTemplateName}": { + "get": { + "tags": [ + "Instance Templates" + ], + "summary": "Get an Instance Template", + "description": "Gets information for the specified Instance Template resource.", + "operationId": "getInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Instance Templates" + ], + "summary": "Upsert an Instance Template", + "description": "Creates a new Instance Template resource or updates an existing Instance Template resource.", + "operationId": "upsertInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceTemplate" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSRequest" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureRequestWithCustomImageAndCreatingNewNicAndPublicIP" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully updated the specified Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "201": { + "description": "Successfully created the requested Instance Template resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetInstanceTemplateResponse" + }, + "examples": { + "AWS_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AWSResponse" + }, + "AZURE_INSTANCE_TEMPLATE": { + "$ref": "#/components/examples/AzureResponse" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + }, + "delete": { + "tags": [ + "Instance Templates" + ], + "summary": "Delete an Instance Template", + "description": "Deletes the specified Instance Template resource.", + "operationId": "deleteInstanceTemplate", + "parameters": [ + { + "$ref": "#/components/parameters/LocationName" + }, + { + "$ref": "#/components/parameters/InstanceTemplateName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Instance Template resource." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/platform/integrations": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "List all Integrations", + "description": "Returns an unfiltered list of account Integrations.", + "operationId": "listIntegrations", + "x-f5-experimental": true, + "responses": { + "200": { + "description": "Successfully retreived all Integration accounts.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListIntegrationResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Integrations" + ], + "summary": "Create an Integration account", + "description": "Creates a new Integration account.", + "operationId": "addIntegration", + "x-f5-experimental": true, + "requestBody": { + "description": "Defines the Integration account to be added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing Integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/platform/integrations/{integrationName}": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get an Integration account", + "description": "Gets information about a specific Integration account.", + "operationId": "getIntegration", + "x-f5-experimental": true, + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "Integration not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Integrations" + ], + "summary": "Update an Integration account", + "description": "Updates an Integration account.", + "operationId": "updateIntegration", + "x-f5-experimental": true, + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "201": { + "description": "Successfully updated the specified Integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Integrations" + ], + "summary": "Delete an Integration account", + "description": "Deletes the specified Integration account resource.", + "operationId": "deleteIntegration", + "x-f5-experimental": true, + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified Integration resource." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/identity-providers": { + "get": { + "tags": [ + "Identity Providers" + ], + "summary": "List Identity Providers", + "description": "Returns a list of all Identity Provider resources.\n\n> **Note:** These resources were known as Client Groups in pre-3.x versions of NGINX Controller.\n", + "operationId": "identityProvidersSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of Identity Provider resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/identity-providers/{identityProviderName}": { + "get": { + "tags": [ + "Identity Providers" + ], + "summary": "Get an Identity Provider", + "description": "Returns the specified Identity Provider resource.", + "operationId": "identityProvidersGet", + "responses": { + "200": { + "description": "Successfully returnd the specified Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "403": { + "description": "The request failed due to insufficient privileges.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Providers" + ], + "summary": "Upsert an Identity Provider", + "description": "Creates a new Identity Provider, or creates an existing Identity Provider resource.\n", + "operationId": "identityProvidersPut", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + }, + "examples": { + "IdentityProviderRequest": { + "$ref": "#/components/examples/IdentityProviderRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "201": { + "description": "Successfully created the requested Identity Provider resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create an Identity Provider resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Identity Providers" + ], + "summary": "Delete an Identity Provider", + "description": "Deletes the specified Identity Provider resource.", + "operationId": "identityProvidersDelete", + "responses": { + "202": { + "description": "The Identity Provider resource has been marked for deletion. The resource will be deleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Identity Provider resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete an Identity Provider resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "500": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + } + ] + }, + "/security/identity-providers/{identityProviderName}/clients": { + "get": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "List Identity Provider Clients", + "description": "Returns a list of all Identity Provider Client resources.\n", + "operationId": "identityProviderClientsSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of Identity Provider Client resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Create Multiple Identity Provider Clients", + "description": "Creates or updates multiple Identity Provider Client resources.\n", + "operationId": "identityProviderClientsPutList", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + }, + "examples": { + "IdentityProviderClientListRequest": { + "$ref": "#/components/examples/IdentityProviderClientListRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully upserted the Identity Provider Client resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider Client resources and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClientList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The Identity Provider Client resource conflicts with another resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + } + ] + }, + "/security/identity-providers/{identityProviderName}/clients/{identityProviderClientName}": { + "get": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Get an Identity Provider Client", + "description": "Returns information for the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsGet", + "responses": { + "200": { + "description": "Successfully returned the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Update an Identity Provider Client", + "description": "Updates the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsPut", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + }, + "examples": { + "IdentityProviderClientRequest": { + "$ref": "#/components/examples/IdentityProviderClientRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "201": { + "description": "Successfully created the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "202": { + "description": "Successfully accepted the requested Identity Provider Client resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Update an Identity Provider Client", + "description": "Updates the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsPatch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIdentityProviderClient" + }, + "examples": { + "IdentityProviderClientPatchMetadataRequest": { + "$ref": "#/components/examples/IdentityProviderClientPatchMetadataRequest" + }, + "IdentityProviderClientPatchDesiredStateRequest": { + "$ref": "#/components/examples/IdentityProviderClientPatchDesiredStateRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Identity Provider Client resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "202": { + "description": "Successfully accepted the request to update an Identity Provider Client resource and is currently processing it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Identity Provider Clients" + ], + "summary": "Delete an Identity Provider Client", + "description": "Deletes the specified Identity Provider Client resource.", + "operationId": "identityProviderClientsDelete", + "responses": { + "202": { + "description": "Identity Provider Client resource has been marked for deletion. The resource will be\ndeleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Identity Provider Client resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Identity Provider Client resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete an Identity Provider Client resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/identityProviderName" + }, + { + "$ref": "#/components/parameters/identityProviderClientName" + } + ] + }, + "/services": { + "x-f5-experimental": true, + "get": { + "tags": [ + "Services" + ], + "summary": "List the metadata for all instances of the desired resource.", + "description": "Returns a metadata list of the requested resource. The resources that can be queried is currently restricted to published-apis.\n", + "operationId": "listResources", + "responses": { + "200": { + "description": "Successfully retrieved a metadata list of the requested resource.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceMeta" + } + } + } + } + }, + "400": { + "description": "The resource defined in the query parameters could not be found or is not yet supported. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The environment defined in the query parameters could not be found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "resource", + "in": "query", + "description": "Desired resource to list.", + "required": true, + "style": "form", + "explode": false, + "schema": { + "type": "string", + "enum": [ + "published-apis" + ] + } + }, + { + "name": "environment", + "in": "query", + "description": "Filter desired resource based on the environment.", + "required": false, + "style": "form", + "explode": false, + "schema": { + "type": "string" + } + } + ] + }, + "/services/api-definitions": { + "get": { + "tags": [ + "API Definitions" + ], + "summary": "List API Definitions", + "description": "Returns a list of API Definition resources.", + "operationId": "apiDefinitionsSearch", + "responses": { + "200": { + "description": "Successfully retrieved a list of all API Definitions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionList" + } + } + } + } + } + } + }, + "/services/api-definitions/{apiDefinitionName}": { + "get": { + "tags": [ + "API Definitions" + ], + "summary": "Get an API Definition", + "description": "Gets information about a specified API Definition.\n", + "operationId": "apiDefinitionsGet", + "responses": { + "200": { + "description": "Successfully returned the specified API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "404": { + "description": "The specified API Definition resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definitions" + ], + "summary": "Upsert an API Definition", + "description": "Creates a new API Definition or updates an existing API Definition resource.\n", + "operationId": "apiDefinitionsPut", + "requestBody": { + "description": "Defines the API Definition resource to create, or the updates to apply to an existing API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definitions" + ], + "summary": "Delete an API Definition", + "description": "Deletes the specified API Definition resource.", + "operationId": "apiDefinitionsDelete", + "responses": { + "204": { + "description": "Successfully deleted the requested API Definition resource. No content is returned.\n" + }, + "404": { + "description": "The specified API Definition resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition resource. Delete any referenced Published APIs or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions": { + "get": { + "tags": [ + "API Definition Versions" + ], + "summary": "List API Definition Versions", + "description": "Lists all Versions for the specified API Definition resource.\n", + "operationId": "definitionVersionsSearch", + "responses": { + "200": { + "description": "Successfully retrieved the list of API Definition Version resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "404": { + "description": "The specified API Definition resource was not found or does not contain any Versions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definition Versions" + ], + "summary": "Add an API Definition Version", + "description": "Creates a single new API Definition Version resource or multiple Version resources.\n", + "operationId": "definitionVersionsPutList", + "requestBody": { + "description": "Creates, updates, or deletes an API Definition Version resource. It interacts with a list of items.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully received the request to create the API Definition Version resource(s).", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersionList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition Version resource(s) as it has at least one dependent Published API. Delete the referenced Published API(s), then try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definition Versions" + ], + "summary": "Delete API Definition Versions", + "description": "Deletes all Versions for the specified API Definition resource.\n", + "operationId": "definitionVersionsDeleteList", + "responses": { + "204": { + "description": "Successfully deleted the Versions for the requested API Definition resource. No content is returned.\n" + }, + "404": { + "description": "The specified API Definition resource was not found or does not contain any Versions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the Versions for the specified API Definition resource. Delete or remove any references to Published APIs, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions/{version}": { + "get": { + "tags": [ + "API Definition Versions" + ], + "summary": "Get an API Definition Version", + "description": "Gets information about an API Definition Version resource.\n", + "operationId": "definitionVersionsGet", + "responses": { + "200": { + "description": "Successfully returned the specified API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "404": { + "description": "The specified API Definition Version resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "API Definition Versions" + ], + "summary": "Upsert an API Definition Version", + "description": "Creates a single new Version resource or updates an existing API Definition Version resource.\n", + "operationId": "definitionVersionsPut", + "requestBody": { + "description": "Creates or updates an API Definition Version resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition Version resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Definition Versions" + ], + "summary": "Delete an API Definition Version", + "description": "Deletes an API Definition Version resource.\n", + "operationId": "definitionVersionsDelete", + "responses": { + "204": { + "description": "Successfully deleted the API Definition Version resource.\n" + }, + "404": { + "description": "The specified API Definition Version resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the specified API Definition resource. Delete or remove any references to Published APIs, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + }, + { + "$ref": "#/components/parameters/versionName" + } + ] + }, + "/services/api-definitions/{apiDefinitionName}/versions/{version}/import": { + "put": { + "tags": [ + "API Definition Version Import" + ], + "summary": "Import an API Definition Version", + "description": "Imports an API spec to the specified Version of an API Definition.\n\nUse this endpoint to import a raw API specification to define your API.\n\n- This endpoint accepts a valid OpenAPI 3 spec, formatted as valid JSON or YAML.\n- The file provided for import will be validated against the\n [OAS v3 schema](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.yaml).\n- You must specify a \"Content-Type\" header when importing an API spec.\n The endpoint accepts the following \"Content-Type\" values:\n\n - application/json\n - application/yaml\n - text/x-yaml\n - application/x-yaml\n - text/yaml\n - application/xml\n - text/xml\n", + "operationId": "definitionVersionsImport", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + }, + "application/yaml": { + "schema": { + "type": "string" + } + }, + "text/x-yaml": { + "schema": { + "type": "string" + } + }, + "application/x-yaml": { + "schema": { + "type": "string" + } + }, + "text/yaml": { + "schema": { + "type": "string" + } + }, + "application/xml": { + "schema": { + "type": "string" + } + }, + "text/xml": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully completed the API Version Import request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "201": { + "description": "Successfully created the requested API Definition Version resource from the spec provided.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "415": { + "description": "The request body contains an unsupported content type.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/apiDefinitionName" + }, + { + "$ref": "#/components/parameters/versionName" + } + ] + }, + "/services/environments": { + "get": { + "tags": [ + "Environments" + ], + "summary": "List all Environments", + "description": "Returns a list of all Environment resources.\n", + "operationId": "listEnvironments", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Environment resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EnvironmentList" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Environments" + ], + "summary": "Create an Environment", + "description": "Creates a new Environment resource.\n", + "operationId": "createEnvironment", + "requestBody": { + "description": "Defines the Environment resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "202": { + "description": "The Environment resource has been accepted for creation. The Environment will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/services/environments/{environmentName}": { + "get": { + "tags": [ + "Environments" + ], + "summary": "Get an Environment", + "description": "Returns information for the specified Environment.\n", + "operationId": "getEnvironment", + "responses": { + "200": { + "description": "Successfully returned information for the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Environments" + ], + "summary": "Upsert an Environment", + "description": "Creates a new Environment or updates an existing Environment resource.\n", + "operationId": "updateEnvironment", + "requestBody": { + "description": "Defines the Environment to create or the updates to make to an existing Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "201": { + "description": "Successfully created the specified Environment resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "202": { + "description": "The Environment resource has been accepted for creation or update. The Environment will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Environments" + ], + "summary": "Delete an Environment", + "description": "Deletes the specified Environment resource.", + "operationId": "deleteEnvironment", + "responses": { + "202": { + "description": "The Environment resource has been marked for deletion. The Environment will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Environment resource. No content returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "Failed to delete the requested Environment resource.\n\nThe Environment contains references to other objects. Delete the referenced objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/apps": { + "get": { + "tags": [ + "Apps" + ], + "summary": "List all Apps", + "description": "Returns a list of all App resources.\n", + "operationId": "listApps", + "responses": { + "200": { + "description": "Successfully retrieved a list of all App resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AppList" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Create an App", + "description": "Creates a new App resource.", + "operationId": "createApp", + "requestBody": { + "description": "An App.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "202": { + "description": "The App resource has been accepted for creation. The App will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get an App", + "description": "Gets the information for a specific App resource.\n", + "operationId": "getApp", + "responses": { + "200": { + "description": "Successfully retrieved information for the requested App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Apps" + ], + "summary": "Upsert an App", + "description": "Creates a new App resource or updates an existing App resource.\n", + "operationId": "updateApp", + "requestBody": { + "description": "Defines the App resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "201": { + "description": "Successfully created the specified App resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "202": { + "description": "The App resource has been accepted for creation or update. The App will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Delete an App", + "description": "Deletes the specified App resource.\n\nYou must delete all of an App's child resources before you delete the App.\n", + "operationId": "deleteApp", + "responses": { + "202": { + "description": "The App resource has been marked for deletion. The App will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified App resource.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified App resource failed.\nThe App contains references to active objects and cannot be deleted. Delete the child objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/components": { + "get": { + "tags": [ + "Components" + ], + "summary": "List all Components", + "description": "Returns a list of all of the Component resources that are contained by the specified App.\n", + "operationId": "listAppComponents", + "responses": { + "200": { + "description": "Successfully retrieved a list of Component resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComponentList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Components" + ], + "summary": "Create a Component", + "description": "Creates a new Component resource.\n", + "operationId": "createAppComponent", + "requestBody": { + "description": "Defines the Component resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + }, + "examples": { + "ComponentRequest": { + "$ref": "#/components/examples/ComponentRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "202": { + "description": "The Component resource has been accepted for creation. The Component will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to create a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/components/{componentName}": { + "get": { + "tags": [ + "Components" + ], + "summary": "Get a Component", + "description": "Returns information for the specified Component.\n", + "operationId": "getAppComponent", + "responses": { + "200": { + "description": "Successfully returned the requested Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Components" + ], + "summary": "Upsert a Component", + "description": "Creates a new Component or updates an existing Component resource.\n", + "operationId": "updateAppComponent", + "requestBody": { + "description": "Defines the Component resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + }, + "examples": { + "ComponentRequest": { + "$ref": "#/components/examples/ComponentRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "201": { + "description": "Successfully created the specified Component resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "202": { + "description": "The Component resource has been accepted for creation or update. The Component will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Components" + ], + "summary": "Delete a Component", + "description": "Deletes the specified Component resource.", + "operationId": "deleteAppComponent", + "responses": { + "202": { + "description": "Component resource has been marked for deletion. The resource will be\ndeleted after the underlying resources have been freed.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Component. No content returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete a Component resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + }, + { + "name": "componentName", + "description": "The name of the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ComponentName" + } + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/published-apis": { + "get": { + "tags": [ + "Published APIs" + ], + "summary": "List Published APIs", + "description": "Returns a list of all Published APIs for the specified Environment and App.\n", + "operationId": "listPublishedAPIs", + "responses": { + "200": { + "description": "Successfully retrieved the list of Published APIs for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPIList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/environmentName" + }, + { + "$ref": "#/components/parameters/appName" + } + ] + }, + "/services/environments/{environmentName}/apps/{appName}/published-apis/{publishedApiName}": { + "get": { + "tags": [ + "Published APIs" + ], + "summary": "Get a Published API", + "description": "Gets information about the specified Published API.\n", + "operationId": "getPublishedAPI", + "responses": { + "200": { + "description": "Successfully retrieved the specified Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Published API resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Published APIs" + ], + "summary": "Upsert a Published API", + "description": "Creates a new Published API or updates an existing Published API resource.", + "operationId": "upsertPublishedAPI", + "requestBody": { + "description": "Defines the Published API to create, or the updates to apply to an existing Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "201": { + "description": "Successfully created the requested Published API resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "202": { + "description": "The request to create a Published API succeeded. The resource will be created when the configuration is complete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Published APIs" + ], + "summary": "Delete a Published API", + "description": "Deletes the specified Published API resource.", + "operationId": "deletePublishedAPI", + "responses": { + "202": { + "description": "Published API has been marked for deletion. The resource will be\ndeleted after the publish/cleanup succeeds.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Published API resource. No content is returned." + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The specified Published API resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/environmentName" + }, + { + "$ref": "#/components/parameters/appName" + }, + { + "$ref": "#/components/parameters/publishedApiName" + } + ] + }, + "/services/environments/{environmentName}/certs": { + "get": { + "tags": [ + "Certs" + ], + "summary": "List all Certs", + "description": "Returns a list of Cert metadata objects for all of the Certs in the specified environment.", + "operationId": "listCerts", + "responses": { + "200": { + "description": "Successfully retrieved a list of Certs for the specified Environment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Certs" + ], + "summary": "Create a Cert", + "operationId": "createCert", + "description": "Creates a new Cert resource in the specified Environment.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cert" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/certs/{certName}": { + "get": { + "tags": [ + "Certs" + ], + "summary": "Get a Cert", + "operationId": "getCert", + "description": "Returns information for a specific Cert resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Cert.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Certs" + ], + "summary": "Upsert a Cert", + "operationId": "updateCert", + "description": "Creates a new Cert or updates an existing Cert resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cert" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Cert resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Certs" + ], + "summary": "Delete a Cert", + "operationId": "deleteCert", + "description": "Deletes the specified Cert resource.", + "responses": { + "204": { + "description": "The specified Cert resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Cert resource failed.\nThe Cert is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "certName", + "description": "The name of the Cert.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/services/environments/{environmentName}/devportals": { + "get": { + "tags": [ + "DevPortals" + ], + "summary": "List all DevPortals", + "description": "Returns a list of all DevPortal resources.\n", + "operationId": "ListDevPortals", + "responses": { + "200": { + "description": "Successfully retrieved a list of all DevPortals resources.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DevPortalsList" + } + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "DevPortals" + ], + "summary": "Create DevPortal", + "description": "Creates new Dev Portal resource.", + "operationId": "CreateDevPortal", + "requestBody": { + "description": "A Dev Portal.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created a specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "202": { + "description": "Dev Portal resource has been accepted for creation. A Dev Portal will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the DevPortal.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/devportals/{devPortalName}": { + "get": { + "tags": [ + "DevPortals" + ], + "summary": "Get Dev Portal", + "description": "Gets the information for a specific Dev Portal resource.\n", + "operationId": "GetDevPortal", + "responses": { + "200": { + "description": "Successfully retrieved information for the requested Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "DevPortals" + ], + "summary": "Upsert Dev Portal", + "description": "Creates a new Dev Portal resource or updates an existing Dev Portal resource.\n", + "operationId": "UpsertDevPortal", + "requestBody": { + "description": "Defines a Dev Portal resource to create or update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "201": { + "description": "Successfully created the specified Dev Portal resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "202": { + "description": "The Dev Portal resource has been accepted for creation or update. Dev Portal will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "400": { + "description": "Illegal input parameter or malformed URI specified. Check for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "DevPortals" + ], + "summary": "Delete a DevPortal", + "description": "Deletes the specified Dev Portal resource.\nYou must delete all of a Dev Portal's child resources before you delete the Dev Portal.\n", + "operationId": "DeleteDevPortal", + "responses": { + "202": { + "description": "The DevPortal resource has been marked for deletion. DevPortal will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified DevPortal resource.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified App resource failed.\nThe App contains references to active objects and cannot be deleted. Delete the child objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the DevPortal.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "devPortalName", + "description": "The name of the DevPortal.", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "/services/environments/{environmentName}/gateways": { + "get": { + "tags": [ + "Gateways" + ], + "summary": "List all Gateways", + "description": "Returns a list of all Gateways in the specified Environment.\n", + "operationId": "listGateways", + "responses": { + "200": { + "description": "Successfully retrieved a list of all Gateways for the specified Environment.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GatewayList" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "tags": [ + "Gateways" + ], + "summary": "Create a Gateway", + "description": "Creates a new Gateway resource.\n", + "operationId": "createGateway", + "requestBody": { + "description": "Defines the Gateway resource to create.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "202": { + "description": "The Gateway resource has been accepted for creation. The Gateway will be created after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to create a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Gateway resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + } + ] + }, + "/services/environments/{environmentName}/gateways/{gatewayName}": { + "get": { + "tags": [ + "Gateways" + ], + "summary": "Get a Gateway", + "description": "Returns information for the specified Gateway resource.\n", + "operationId": "getGateway", + "responses": { + "200": { + "description": "Successfully retrieved the requested Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "tags": [ + "Gateways" + ], + "summary": "Upsert a Gateway", + "description": "Creates a new Gateway or updates an existing Gateway resource.\n", + "operationId": "updateGateway", + "requestBody": { + "description": "Defines the Gateway resource to create or the updates to make to an existing Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "201": { + "description": "Successfully created the specified Gateway resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "202": { + "description": "The Gateway resource has been accepted for creation or update. The Gateway will be created or updated after it is done configuring.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to update or create a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Gateways" + ], + "summary": "Delete a Gateway", + "description": "Deletes the specified Gateway resource.", + "operationId": "deleteGateway", + "responses": { + "202": { + "description": "The Gateway resource has been marked for deletion. The Gateway will be deleted after the underlying resources have been deleted.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "204": { + "description": "Successfully deleted the specified Gateway resource. No content is returned.\n" + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete a Gateway resource failed.\nThe Gateway is referenced by an App Component(s) and cannot be deleted.\nDelete the App Component or remove the reference, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "429": { + "description": "The request to delete a Gateway resource failed due to exceeding request processing threshold.\nAllow the server to process existing requests, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "environmentName", + "description": "The name of the Environment that contains the Gateway resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + { + "name": "gatewayName", + "description": "The name of the Gateway.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/GatewayName" + } + } + ] + }, + "/services/errorsets": { + "get": { + "tags": [ + "Error Sets" + ], + "summary": "List all Error Sets.", + "description": "Returns a list of all the Error Sets.", + "operationId": "listErrorSets", + "responses": { + "200": { + "description": "Successfully retrieved a list of Error Sets.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorSetList" + } + } + } + } + } + } + }, + "/services/errorsets/{errorSetName}": { + "get": { + "tags": [ + "ErrorSets" + ], + "summary": "Get an Error Set.", + "operationId": "getErrorSet", + "description": "Returns the information for a specific Error Set.", + "responses": { + "200": { + "description": "Successfully retrieved the requested Error Set.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorSet" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "errorSetName", + "description": "The name of the Error Set.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + }, + "/security/policies": { + "x-f5-experimental": true, + "get": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "List all Policies", + "description": "Returns a list of Policy metadata objects for all of the Policies.", + "operationId": "listPolicies", + "responses": { + "200": { + "description": "Successfully retrieved a list of Policies.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyList" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "post": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "Create a Policy", + "operationId": "createPolicy", + "description": "Creates a new Policy resource.\n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the specified Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request failed due to a naming conflict with an existing resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + } + }, + "/security/policies/{policyName}": { + "get": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "Get a Policy", + "operationId": "getPolicy", + "description": "Returns information for a specific Policy resource.", + "responses": { + "200": { + "description": "Sucessfully retrieved the requested Policy.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "put": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "Upsert a Policy", + "operationId": "updatePolicy", + "description": "Creates a new Policy or updates an existing Policy resource.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + } + }, + "responses": { + "200": { + "description": "Sucessfully updated the specified Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "201": { + "description": "Successfully created the requested Policy resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "delete": { + "x-f5-experimental": true, + "tags": [ + "Policies" + ], + "summary": "Delete a Policy", + "operationId": "deletePolicy", + "description": "Deletes the specified Policy resource.", + "responses": { + "204": { + "description": "The specified Policy resource was successfully deleted." + }, + "404": { + "description": "The resource defined in the URI could not be found. Check the URI for errors and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "409": { + "description": "The request to delete the specified Policy resource failed.\nThe Policy is referenced by active objects and cannot be deleted. Delete the referencing objects or remove the references, then try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + } + } + }, + "parameters": [ + { + "name": "policyName", + "description": "The name of the Policy.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ResourceName" + } + } + ] + } + }, + "components": { + "parameters": { + "LocationName": { + "name": "locationName", + "in": "path", + "description": "The name of the Location that contains the Instance.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceName": { + "name": "instanceName", + "in": "path", + "description": "The name of the Instance.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "environmentName": { + "name": "environmentName", + "description": "The name of the Environment that contains the Component's parent App.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EnvironmentName" + } + }, + "appName": { + "name": "appName", + "description": "The name of the App that contains the Component resource.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/AppName" + } + }, + "apiDefinitionName": { + "name": "apiDefinitionName", + "in": "path", + "description": "The name of the API Definition resource.", + "required": true, + "style": "simple", + "explode": false, + "example": "shopping-app-api-def", + "schema": { + "type": "string" + } + }, + "publishedApiName": { + "name": "publishedApiName", + "in": "path", + "description": "The name of the Published API resource.", + "required": true, + "style": "simple", + "explode": false, + "example": "shopping-app-api-staging", + "schema": { + "type": "string" + } + }, + "versionName": { + "name": "version", + "in": "path", + "description": "The Version of the API Definition.", + "required": true, + "style": "simple", + "explode": false, + "example": "v1_2fd4e1c6", + "schema": { + "type": "string" + } + }, + "InstanceGroupName": { + "name": "instanceGroupName", + "in": "path", + "description": "The name of the Instance Group.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "identityProviderName": { + "name": "identityProviderName", + "in": "path", + "description": "The name of the Identity Provider.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "identityProviderClientName": { + "name": "identityProviderClientName", + "in": "path", + "description": "The name of the Identity Provider Client.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "InstanceTemplateName": { + "name": "instanceTemplateName", + "in": "path", + "description": "The name of the Instance Template resource.", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "IntegrationName": { + "name": "integrationName", + "in": "path", + "description": "The name of the Integration resource.", + "required": true, + "schema": { + "type": "string" + } + } + }, + "schemas": { + "SelfLinks": { + "type": "object", + "description": "The SelfLinks object contains a link from the resource to itself.\nThis object is used only in responses.\n", + "properties": { + "rel": { + "type": "string", + "example": "/api/v1/services/environments/prod", + "description": "`rel` contains the complete path fragment of a URI and can be used\nto construct a query to the object.\n" + } + } + }, + "ResourceMeta": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\*\\\"\\[\\]\\{\\}\\\\\\/%\\?:=&\\~\\^|#<>]+$", + "minLength": 1, + "maxLength": 1024, + "example": "resource-name", + "description": "Resource name is a unique identifier for a resource within the context of a namespace.\nResource names must conform to [RFC 1738 Section 2.2](https://www.ietf.org/rfc/rfc1738.txt) and have a valid syntax for email addresses. The following rules are enforced:\n\n- do not utilize URL encoding;\n- do not include spaces;\n- do not use uppercase characters, for example, 'A-Z'; extended character sets are supported;\n- do not use the following characters: `\"`, `*`, `:`, `;`, `/`, `\\`, `%`, `?`, `hash`, `=`, `&`, `|`, `~`, `^`, `{`, `}`, `[`, `]`, `<`, `>`;\n- cannot start or end with an `@` sign;\n\nFor example: For a collection resource located at\n\n`https://controller.example.com/api/v1/services/apps/shopping_@1`\n\nthe resource name is \"shopping_@1\".\n" + }, + "displayName": { + "type": "string", + "example": "My Display Name", + "description": "`displayName` is a user friendly resource name. It can be used to define \na longer, and less constrained, name for a resource.\n\nDisplay names:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "description": { + "type": "string", + "example": "This is a sample description string. It provides information about the resource.", + "description": "`description` is a free-form text property. You can use it to provide information that helps \nto identify the resource.\n\nDescriptions:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "kind": { + "type": "string", + "example": "-", + "description": "Kind is a string representation of an API resource's data type.\nIt is assigned by the server and cannot be changed. \n\nWhen creating a `kind`, the server uses hyphens to connect word segments; \nsingleton and collection item resources are not pluralized.\n" + }, + "uid": { + "type": "string", + "format": "uuid", + "example": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "description": "Unique Identifier (UID)\n\nUID is a unique identifier in time and space for a resource. \nWhen you create a resource, the server assigns a UID to the resource.\n\nRefer to [IETF RFC 4122](https://tools.ietf.org/html/rfc4122) for more information.\n" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ], + "description": "You can assign `tags` to a resource as a way to help map, scope, \nand organize resources. \n\nThe system uses tag selectors to specify selection criteria that \nmatch resources that have particular tags.\n" + }, + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "The `ref` field contains a reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/SelfLinks" + }, + "createTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was created.\n\nCreate time is not guaranteed to be set in \"happens-before\" order\nacross separate operations.\n\nIn JSON format, `create_time` type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n\nCreate Time is assigned by the server and cannot be changed.\n" + }, + "updateTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was last modified.\n\nResources that have never been updated do not have an `update_time` stamp.\n\nThe default value for resources that have never been updated is the local \nlanguage-specific equivalent of \"null\".\n\nIn JSON format, `update_time` type is encoded as a string as described in \n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n" + } + } + }, + "ResourceName": { + "type": "string", + "description": "The name of a resource.", + "example": "production" + }, + "ConfigStateTally": { + "type": "object", + "properties": { + "isConfigured": { + "type": "boolean", + "description": "The configuration operation is complete." + }, + "isConfiguring": { + "type": "boolean", + "description": "The configuration of the resource, or of its child(ren), is in process." + }, + "isError": { + "type": "boolean", + "description": "An error occurred while configuring the resource or its child(ren)." + }, + "isDeleting": { + "type": "boolean", + "description": "A delete operation is in progress for the resource or its child(ren)." + }, + "total": { + "type": "integer", + "description": "The total number of resources to which the configuration operation applies." + }, + "configured": { + "type": "integer", + "description": "The number of resources that have a complete and valid configuration." + }, + "configuring": { + "type": "integer", + "description": "The number of resources that are in the process of being configured." + }, + "error": { + "type": "integer", + "description": "The number of resources that have encountered an error during the configuration process." + }, + "deleting": { + "type": "integer", + "description": "The number of resources that are in the process of being deleted." + } + } + }, + "ConfigCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The condition type." + }, + "message": { + "type": "string", + "description": "A human-readable message that provides additional information about the configuration operation." + } + } + }, + "ConfigState": { + "type": "object", + "description": "A representation of the resource's current configuration state \nthat comprises the status of the resource itself (`selfConfigState`) and any child \nresources (`childrenConfigState`).\n\nThe conditions array provides additional information during configuration changes.\n", + "properties": { + "selfConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "childrenConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigCondition" + } + } + } + }, + "NamedLinks": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfLinks" + }, + { + "type": "object", + "description": "Contains information about the object being referred to.\n\nThese are generally details -- like the object name and display name --\nthat are useful to a consumer of the API that performs further\nprocessing. \n\nThis object is only present in responses.\n \n", + "properties": { + "name": { + "type": "string", + "example": "production", + "description": "The name of the linked resource.\n" + }, + "displayName": { + "type": "string", + "example": "Production Environment", + "description": "A user friendly resource name." + } + } + } + ] + }, + "ResourceRef": { + "type": "object", + "required": [ + "ref" + ], + "properties": { + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "A reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "ErrorDetail": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "example": "Error doing : . This can lead to . Try to resolve the issue.", + "description": "A detailed error message returned by the server. \n\nThese messages contain the following information, where applicable:\n\n- What happened.\n- Why it happened.\n- What the consequences are (if any).\n- Recommended action to take to resolve the issue.\n" + } + } + }, + "ErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string", + "example": "Error doing .", + "description": "A human-readable message, in English, that describes the error.\n" + }, + "code": { + "type": "integer", + "example": 1234567, + "description": "A numeric error code that can be used to identify errors for support purposes.\n" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorDetail" + } + } + } + }, + "EnvironmentName": { + "type": "string" + }, + "AppName": { + "type": "string" + }, + "Instance": { + "type": "object", + "description": "An NGINX Instance.", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceDesiredState" + } + } + }, + "GetInstanceResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Instance" + } + ] + }, + "ListInstanceResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Instance" + } + } + } + }, + "InstanceRequest": { + "allOf": [ + { + "$ref": "#/components/schemas/Instance" + } + ], + "description": "Describes the Instance to update." + }, + "InstanceDesiredState": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/AWSInstanceDesiredState" + }, + { + "$ref": "#/components/schemas/AzureInstanceDesiredState" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_INSTANCE": "#/components/schemas/OtherInstanceDesiredState", + "AWS_INSTANCE": "#/components/schemas/AWSInstanceDesiredState", + "AZURE_INSTANCE": "#/components/schemas/AzureInstanceDesiredState" + } + } + }, + "InstanceCurrentStatus": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/AWSInstanceCurrentStatus" + }, + { + "$ref": "#/components/schemas/AzureInstanceCurrentStatus" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_INSTANCE": "#/components/schemas/OtherInstanceCurrentStatus", + "AWS_INSTANCE": "#/components/schemas/AWSInstanceCurrentStatus", + "AZURE_INSTANCE": "#/components/schemas/AzureInstanceCurrentStatus" + } + } + }, + "OtherInstanceDesiredState": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "OTHER_INSTANCE is an Instance pre-installed and self-registered during NGINX installation.\n", + "enum": [ + "OTHER_INSTANCE" + ] + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "AWSInstanceDesiredState": { + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "AWS_INSTANCE is an Instance hosted in Amazon Web Services (AWS).\n", + "enum": [ + "AWS_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "AzureInstanceDesiredState": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "type", + "templateRef" + ], + "properties": { + "type": { + "type": "string", + "description": "AZURE_INSTANCE is an Instance hosted in Microsoft Azure.", + "enum": [ + "AZURE_INSTANCE" + ] + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + } + } + }, + "OtherInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the Other Instance.", + "required": [ + "type", + "hostname", + "version", + "agent", + "status", + "muted" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "OTHER_INSTANCE is an Instance pre-installed and self-registered during NGINX installation.\n", + "enum": [ + "OTHER_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/OtherNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "status": { + "deprecated": true, + "allOf": [ + { + "$ref": "#/components/schemas/ConfigState" + } + ] + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "AWSInstanceCurrentStatus": { + "type": "object", + "description": "Contains the current status of the AWS Instance.", + "required": [ + "type", + "hostname", + "version", + "agent", + "muted" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "AWS_INSTANCE is an Instance hosted in Amazon Web Services (AWS).\n", + "enum": [ + "AWS_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/AWSNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "AzureInstanceCurrentStatus": { + "x-f5-experimental": true, + "type": "object", + "description": "Contains the current status of the Azure Instance.", + "required": [ + "type", + "hostname", + "version", + "agent" + ], + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Instance." + }, + "instanceID": { + "type": "string", + "description": "The ID of the Instance." + }, + "version": { + "type": "string", + "description": "The version of NGINX running on the Instance." + }, + "muted": { + "type": "boolean", + "description": "Indicates the mute status of notifications and alerts.\n- 'True' means that notifications and alerts are muted.\n- 'False' means that notifications and alerts are active.\n", + "deprecated": true + }, + "type": { + "type": "string", + "description": "AZURE_INSTANCE is an Instance hosted in Microsoft Azure.", + "enum": [ + "AZURE_INSTANCE" + ] + }, + "networkConfig": { + "$ref": "#/components/schemas/AzureNetworkConfig" + }, + "agent": { + "$ref": "#/components/schemas/Agent" + }, + "templateRef": { + "$ref": "#/components/schemas/TemplateRef" + }, + "nginx": { + "$ref": "#/components/schemas/Nginx" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "legacyNginxMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacyNginxMetadata" + }, + "legacySystemMetadata": { + "deprecated": true, + "$ref": "#/components/schemas/LegacySystemMetadata" + } + } + }, + "TemplateRef": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + } + ], + "description": "Reference to an existing Instance Template resource. This field cannot be updated." + }, + "LegacySystemMetadata": { + "type": "object", + "deprecated": true, + "description": "Metadata that describe the operating system attributes and properties of an Instance host system. It is\nintended for internal use only and is subject to change.\n", + "additionalProperties": true + }, + "LegacyNginxMetadata": { + "type": "object", + "deprecated": true, + "description": "Metadata that describe an Instance's NGINX process configuration and properties. It is intended\nfor internal use only and is subject to change.\n", + "additionalProperties": true + }, + "Agent": { + "type": "object", + "description": "The properties of the Controller Agent running on the Instance", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string", + "description": "The version of Controller Agent that is currently running on the Instance." + }, + "online": { + "type": "boolean", + "description": "The status of Controller Agent that is currently running on the Instance." + }, + "credentials": { + "$ref": "#/components/schemas/AgentCredentials" + } + } + }, + "AgentCredentials": { + "type": "object", + "description": "The credentials of the Controller Agent running on the Instance.", + "properties": { + "hostname": { + "type": "string", + "description": "The hostname of the Agent." + }, + "uuid": { + "type": "string", + "description": "The uuid of the Agent." + } + } + }, + "OtherNetworkConfig": { + "type": "object", + "description": "The network config of a customer deployed Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OtherNetworkInterface" + } + } + } + }, + "OtherNetworkInterface": { + "type": "object", + "description": "A network interface for a customer deployed Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "privateDnsName": { + "type": "string", + "description": "The private, internal hostname of the instance, which resolves to the Instance's private IP address.\n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "privateIPv6": { + "type": "string", + "description": "The private IPv6 address of the network interface." + }, + "alternateIPList": { + "type": "array", + "items": { + "type": "string" + } + }, + "alternateIPv6List": { + "type": "array", + "items": { + "type": "string" + } + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "AWSNetworkConfig": { + "type": "object", + "description": "The network config of an AWS Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSNetworkInterface" + } + } + } + }, + "AWSNetworkInterface": { + "type": "object", + "description": "A network interface for an AWS Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "privateDnsName": { + "type": "string", + "description": "The private, internal hostname of the instance, which resolves to the Instance's private IP address. \n" + }, + "publicDnsName": { + "type": "string", + "description": "The public hostname of the instance, which resolves to the public IP address of the Instance. \n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "publicIP": { + "type": "string", + "description": "The public IP address of the network interface." + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "subnetID": { + "type": "string", + "description": "The ID of the subnet into which the instance was launched." + }, + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "AzureNetworkConfig": { + "type": "object", + "description": "The network config of an Azure Instance.", + "properties": { + "networkInterfaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureNetworkInterface" + } + } + } + }, + "AzureNetworkInterface": { + "type": "object", + "description": "A network interface associated with an Azure Instance.", + "properties": { + "name": { + "type": "string", + "description": "The name of the network interface attached to the Instance." + }, + "publicDnsName": { + "type": "string", + "description": "The public hostname of the instance, which resolves to the public IP address of the Instance. \n" + }, + "privateIP": { + "type": "string", + "description": "The private IP address of the network interface." + }, + "publicIP": { + "type": "string", + "description": "The public IP address of the network interface." + }, + "privateIPv6": { + "type": "string", + "description": "The private IPv6 address of the network interface." + }, + "publicIPv6": { + "type": "string", + "description": "The public IPv6 address of the network interface." + }, + "subnet": { + "type": "object", + "description": "The subnet that contains the interface.", + "properties": { + "subnetID": { + "type": "string", + "description": "The ID of the subnet that contains the Instance." + }, + "cidrIPv4": { + "type": "string", + "description": "The IPv4 CIDR for the subnet." + }, + "cidrIPv6": { + "type": "string", + "description": "The IPv6 CIDR for the subnet." + } + } + } + } + }, + "Nginx": { + "type": "object", + "description": "Defines properties and configuration values for Nginx.\n", + "properties": { + "process": { + "$ref": "#/components/schemas/NginxProcess" + } + } + }, + "NginxProcess": { + "type": "object", + "description": "Defines configuration directives that are defined in the main configuration context.\n", + "properties": { + "user": { + "type": "string", + "description": "Defines user credentials used by worker processes.\n", + "default": "nginx" + }, + "group": { + "type": "string", + "description": "Defines group credentials used by worker processes. This will be ignored if the user\nproperty is not defined.\n", + "default": "nginx" + } + } + }, + "APIDefinition": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/APIDefinitionCurrentStatus" + } + } + }, + "APIDefinitionCurrentStatus": { + "type": "object", + "properties": { + "apiDefinitionVersionRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "APIDefinitionList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIDefinition" + } + } + } + }, + "APIDefinitionSpecMapping": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/RESTAPISpec" + }, + { + "$ref": "#/components/schemas/gRPCProxySpec" + }, + { + "$ref": "#/components/schemas/SOAPAPISpec" + } + ] + } + }, + "RESTAPISpec": { + "type": "object", + "description": "Validates an Imported OpenAPI 3 spec formatted as JSON using the [OAS v3 schema.yaml](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v3.0/schema.yaml) specification.\n" + }, + "SOAPAPISpec": { + "type": "object", + "description": "Validates and Transforms an Imported WSDL spec.\n", + "properties": { + "wsdl": { + "type": "string" + }, + "soap-config": { + "$ref": "#/components/schemas/SoapConfig" + } + }, + "required": [ + "soap-config" + ] + }, + "SoapConfig": { + "type": "object", + "description": "Transformed WSDL to OpenAPI spec config.\n", + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "tns": { + "type": "string" + }, + "qualifiedFields": { + "type": "boolean" + }, + "endpoints": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/SoapConfigEndpoint" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/SoapConfigWSDLType" + } + }, + "messages": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/SoapConfigMessage" + } + } + }, + "required": [ + "name", + "url", + "tns", + "endpoints", + "types", + "messages", + "qualifiedFields" + ] + }, + "SoapConfigEndpoint": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "in": { + "type": "string" + }, + "out": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "restHTTPMethod": { + "type": "string", + "enum": [ + "get", + "head", + "post", + "put", + "patch", + "delete" + ] + }, + "restURI": { + "type": "string" + } + }, + "required": [ + "name", + "in", + "out", + "enabled", + "restHTTPMethod", + "restURI" + ] + }, + "SoapConfigMessage": { + "type": "object", + "description": "Validates and Transforms an Imported WSDL spec.\n", + "properties": { + "name": { + "type": "string" + }, + "parts": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/SoapConfigMessagePart" + } + } + }, + "required": [ + "name", + "parts" + ] + }, + "SoapConfigMessagePart": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "restName": { + "type": "string" + }, + "type": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "name", + "restName" + ] + }, + "SoapConfigWSDLType": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "properties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SoapConfigNestedWSDLType" + } + }, + "hasOneOfProperties": { + "type": "boolean" + }, + "hasOrderedProperties": { + "type": "boolean" + }, + "enum": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "name", + "type", + "hasOneOfProperties", + "hasOrderedProperties" + ] + }, + "SoapConfigNestedWSDLType": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "restName": { + "type": "string" + }, + "type": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "isRequired": { + "type": "boolean" + }, + "isArray": { + "type": "boolean" + } + }, + "required": [ + "name", + "restName", + "isRequired", + "isArray" + ] + }, + "gRPCProxySpec": { + "x-f5-experimental": true, + "type": "object", + "description": "Validates an Imported gRPC spec.\n" + }, + "APIDefinitionVersion": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/APIDefinitionVersionMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/APIDefinitionVersionDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/APIDefinitionVersionCurrentStatus" + } + } + }, + "APIDefinitionVersionList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIDefinitionVersion" + } + } + } + }, + "APIDefinitionVersionDesiredState": { + "type": "object", + "properties": { + "specs": { + "$ref": "#/components/schemas/APIDefinitionSpecMapping" + } + } + }, + "APIDefinitionVersionCurrentStatus": { + "type": "object", + "properties": { + "specs": { + "$ref": "#/components/schemas/APIDefinitionSpecMapping" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "apiDefinitionVersionRef": { + "type": "object", + "properties": { + "ref": { + "type": "string", + "description": "Reference to the Version of the API Definition.\n", + "example": "/services/api-definitions/baseball-stats/versions/v1" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "APIDefinitionVersionMeta": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceMeta" + }, + { + "type": "object", + "properties": { + "isDefaultVersion": { + "type": "boolean" + } + } + } + ] + }, + "EnvironmentList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "Environment": { + "type": "object", + "description": "An Environment is a logical container that you can use to organize your Apps. A few commonly-used examples of Environments are \"dev\" and \"production\".", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "x-f5-experimental": true, + "type": "object" + }, + "currentStatus": { + "$ref": "#/components/schemas/EnvironmentCurrentStatus" + } + } + }, + "EnvironmentCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "gatewayRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "appRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "certRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "DevPortalsList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DevPortal" + } + } + } + }, + "DevPortal": { + "type": "object", + "description": "A Dev Portal.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/DevPortalDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/DevPortalCurrentStatus" + } + }, + "additionalProperties": false + }, + "DevPortalDesiredState": { + "type": "object", + "required": [ + "ingress" + ], + "properties": { + "ingress": { + "type": "object", + "required": [ + "gatewayRefs" + ], + "properties": { + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateways that act as a Developer Portal.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "additionalProperties": false + }, + "devPortalTheme": { + "$ref": "#/components/schemas/DevPortalTheme" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devPortalType": { + "type": "string", + "enum": [ + "private", + "public", + "partner" + ] + } + }, + "additionalProperties": false + }, + "DevPortalCurrentStatus": { + "type": "object", + "properties": { + "ingress": { + "type": "object", + "required": [ + "gatewayRefs" + ], + "properties": { + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateways that act as a Developer Portal.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "devPortalTheme": { + "$ref": "#/components/schemas/DevPortalTheme" + }, + "publishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "publishedTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "Published time is a timestamp that represents the server time when the resource was published.\nResources that have never been published do not have an `published_time` stamp.\nThe default value is language-specific and, in general, should be equivalent of the null construct.\nIn JSON format, `published_time` type is encoded as a string as described in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n" + } + } + }, + "DevPortalTheme": { + "description": "Specifies the theming for the Developer Portal.", + "type": "object", + "properties": { + "overrideDefaultTheme": { + "type": "boolean", + "example": false, + "description": "Override the default Dev Portal theme with a custom theme." + }, + "customConfig": { + "type": "object", + "properties": { + "primary": { + "$ref": "#/components/schemas/ThemeConfig" + }, + "secondary": { + "$ref": "#/components/schemas/ThemeConfig" + }, + "fonts": { + "type": "object", + "properties": { + "assignments": { + "$ref": "#/components/schemas/FontAssignments" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "brandName": { + "$ref": "#/components/schemas/BrandName" + }, + "logo": { + "$ref": "#/components/schemas/FileEncodedString" + }, + "defaultLogo": { + "$ref": "#/components/schemas/FileEncodedString" + }, + "favicon": { + "$ref": "#/components/schemas/FileEncodedString" + } + }, + "additionalProperties": false + }, + "ThemeConfig": { + "type": "object", + "properties": { + "color": { + "$ref": "#/components/schemas/ThemeConfigColors" + } + }, + "additionalProperties": false + }, + "ThemeConfigColors": { + "type": "object", + "properties": { + "primary": { + "type": "string", + "example": "#575fe6", + "description": "A CSS color string used as a primary brand theme color." + }, + "accent": { + "type": "string", + "example": "#48dbac", + "description": "A CSS color string used as an optional second brand theme color." + }, + "gray": { + "type": "string", + "example": "#1e1f27", + "description": "A CSS color string used to generate a grayscale color palette." + }, + "link": { + "type": "string", + "example": "#0f55bd", + "description": "A CSS color string used to generate anchor link colors." + }, + "fill": { + "type": "string", + "example": "#fafbfc", + "description": "A CSS color string used as the main background color." + }, + "ink": { + "type": "string", + "example": "#323441", + "description": "A CSS color string used as the main text color." + }, + "status": { + "$ref": "#/components/schemas/ThemeConfigStatusColors" + } + }, + "additionalProperties": false + }, + "ThemeConfigStatusColors": { + "type": "object", + "description": "A collection of CSS color strings used to indicate status.", + "properties": { + "info": { + "type": "string", + "example": "#20a9ea", + "description": "A CSS color string used to indicate an informational status." + }, + "success": { + "type": "string", + "example": "#37c497", + "description": "A CSS color string used to indicate a success status." + }, + "error": { + "type": "string", + "example": "#ed4f54", + "description": "A CSS color string used to indicate an error status." + }, + "warning": { + "type": "string", + "example": "#ffb900", + "description": "A CSS color string used to indicate a warning status." + } + }, + "additionalProperties": false + }, + "ThemeConfigFonts": { + "type": "object", + "description": "A collection of fonts for theming typography.", + "properties": { + "headings": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for headlines." + }, + "body": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for body copy." + }, + "cta": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for calls to action." + }, + "code": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for code and syntax highlighting." + }, + "special": { + "allOf": [ + { + "$ref": "#/components/schemas/ThemeConfigFont" + } + ], + "description": "A font used for special accent typography." + }, + "baseFontSize": { + "$ref": "#/components/schemas/BaseFontSize" + }, + "embeddedLink": { + "$ref": "#/components/schemas/EmbeddedLink" + } + }, + "additionalProperties": false + }, + "ThemeConfigFont": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": [ + "google-web-font" + ] + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false + }, + "FileEncodedString": { + "type": "string", + "example": "c29tZXRoaW5nIA==", + "description": "Base64 encoded string of a logo." + }, + "BrandName": { + "type": "string", + "example": "Acme", + "description": "Name of the brand." + }, + "BaseFontSize": { + "type": "integer", + "example": 14 + }, + "EmbeddedLink": { + "type": "string" + }, + "FontAssignments": { + "type": "object", + "$ref": "#/components/schemas/ThemeConfigFonts" + }, + "ListInstanceGroupsResponse": { + "x-f5-experimental": true, + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + } + }, + "GetInstanceGroupResponse": { + "x-f5-experimental": true, + "allOf": [ + { + "$ref": "#/components/schemas/InstanceGroup" + } + ] + }, + "InstanceGroup": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceGroupState" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceGroupStatus" + } + } + }, + "InstanceGroupState": { + "x-f5-experimental": true, + "type": "object", + "properties": { + "bigIpIntegration": { + "$ref": "#/components/schemas/BigIpIntegration" + } + } + }, + "InstanceGroupStatus": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "state" + ], + "properties": { + "instanceRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceRef" + } + }, + "bigIpIntegration": { + "$ref": "#/components/schemas/BigIpIntegration" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "InstanceRef": { + "x-f5-experimental": true, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + } + ], + "description": "Reference to a member Instance resource." + }, + "BigIpIntegration": { + "x-f5-experimental": true, + "type": "object", + "properties": { + "integrationRef": { + "description": "Reference to a BIG-IP Integration object, indicating that the Instances will be members of a BIG-IP server pool.", + "$ref": "#/components/schemas/ResourceRef" + }, + "serverPoolIp": { + "description": "The Instance IP address or CIDR to use when the Instance is a member of a BIG-IP server pool.\nIf this is a CIDR, then the Instance IP address that matches the mask will be the member address in the BIG-IP server pool.\nOtherwise, if this is an absolute IP address, that will be used as the server-pool member address.\n", + "type": "string" + } + } + }, + "IdentityProviderList": { + "type": "object", + "description": "Contains a list of Identity Provider resources.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "APIKeyIdentityProvider": { + "required": [ + "type" + ], + "type": "object", + "description": "Use an API key for authentication.\n\n> **Note:** Use of API Key authN is not recommended in production environments.\n", + "properties": { + "type": { + "type": "string", + "enum": [ + "API_KEY" + ] + } + } + }, + "JWTIdentityProvider": { + "required": [ + "jwkFile", + "type" + ], + "type": "object", + "description": "Use a JWT for authentication.", + "properties": { + "type": { + "type": "string", + "enum": [ + "JWT" + ] + }, + "jwkFile": { + "description": "Provide the path to - or URI for - a `.jwk` file to use for authentication.\nYou can also provide the `.jwk` file contents inline.\n", + "discriminator": { + "propertyName": "type", + "mapping": { + "INLINE": "#/components/schemas/JWKInline", + "REMOTE_FILE": "#/components/schemas/JWKRemoteFile" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/JWKInline" + }, + { + "$ref": "#/components/schemas/JWKRemoteFile" + } + ] + } + } + }, + "IdentityProviderDesiredState": { + "required": [ + "environmentRefs", + "identityProvider" + ], + "type": "object", + "properties": { + "environmentRefs": { + "description": "The Enviroment associated with the Identity Provider.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "identityProvider": { + "$ref": "#/components/schemas/IdentityProviderData" + } + }, + "example": { + "environmentRefs": [ + { + "ref": "/services/environments/env1" + } + ], + "identityProvider": { + "type": "JWT", + "jwkFile": { + "type": "REMOTE_FILE", + "uri": "https://example.com/keys.jwk", + "cacheExpire": "10h" + } + } + } + }, + "IdentityProviderCurrentStatus": { + "required": [ + "environmentRefs", + "identityProvider", + "state" + ], + "type": "object", + "properties": { + "environmentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "identityProvider": { + "$ref": "#/components/schemas/IdentityProviderData" + } + } + }, + "IdentityProvider": { + "required": [ + "desiredState", + "metadata" + ], + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderDesiredState" + } + } + }, + "IdentityProviderData": { + "description": "The means of authentication used by the Identity Provider (JWT or APIKey).", + "oneOf": [ + { + "$ref": "#/components/schemas/JWTIdentityProvider" + }, + { + "$ref": "#/components/schemas/APIKeyIdentityProvider" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "API_KEY": "#/components/schemas/APIKeyIdentityProvider", + "JWT": "#/components/schemas/JWTIdentityProvider" + } + } + }, + "IdentityProviderClientDesiredState": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/IdentityProviderClientCredential" + } + } + }, + "IdentityProviderClientCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "credential": { + "$ref": "#/components/schemas/IdentityProviderClientCredential" + } + } + }, + "IdentityProviderClient": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderClientCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderClientDesiredState" + } + } + }, + "IdentityProviderClientCredential": { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityProviderAPIKey" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "API_KEY": "#/components/schemas/IdentityProviderAPIKey" + } + } + }, + "IdentityProviderClientList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProviderClient" + } + } + } + }, + "UpdateIdentityProviderClient": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/IdentityProviderClientCurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/IdentityProviderClientDesiredState" + } + } + }, + "JWK": { + "type": "object", + "properties": { + "kty": { + "type": "string", + "description": "The cryptographic algorithm family used with the key, such as \"RSA\" or \"EC\"." + }, + "use": { + "type": "string", + "description": "The intended use of the public key, whether for encrypting data or verifying the signature on data." + }, + "key_ops": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The operation(s) for which the key is intended to be used." + }, + "alg": { + "type": "string", + "description": "The algorithm intended for use with the key." + }, + "kid": { + "type": "string", + "description": "The key ID used to match a specific key." + }, + "x5u": { + "type": "string", + "description": "The X.509 URL that refers to a resource for an X.509 public key certificate or certificate chain." + }, + "x5c": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The X.509 Certificate Chain of one or more PKIX certificates. The PKIX certificate containing the key value MUST be the first certificate." + }, + "x5t": { + "type": "string", + "description": "The X.509 Certificate SHA-1 Thumbprint (a.k.a. digest) of the DER encoding of an X.509 certificate." + }, + "x5t256": { + "type": "string", + "description": "The X.509 Certificate SHA-256 Thumbprint (a.k.a. digest) of the DER encoding of an X.509 certificate." + }, + "p2s": { + "type": "string", + "description": "The salt input value for PBES2 key encryption, which is used as part of the PBKDF2 salt value." + }, + "p2c": { + "type": "string", + "description": "The PBKDF2 iteration count for PBES2 key encryption, represented as a positive JSON integer. The iteration count adds computational expense, ideally compounded by the possible range of keys introduced by the salt. A minimum iteration count of 1000 is RECOMMENDED." + }, + "crv": { + "type": "string", + "description": "The cryptographic curve used for an Elliptic Curve public key." + }, + "x": { + "type": "string", + "description": "The x coordinate of the point for an Elliptic Curve public key." + }, + "y": { + "type": "string", + "description": "The y coordinate of the point for an Elliptic Curve public key." + }, + "e": { + "type": "string", + "description": "The exponent value for an RSA public key." + }, + "exp": { + "type": "string", + "description": "The exponent value for an RSA public key." + }, + "n": { + "type": "string", + "description": "The modulus value for an RSA public key." + }, + "mod": { + "type": "string", + "description": "The modulus value for an RSA public key." + }, + "d": { + "type": "string", + "description": "The private key value for an Elliptic Curve private key OR the private exponent value for an RSA private key." + }, + "p": { + "type": "string", + "description": "The first prime factor for an RSA private key." + }, + "q": { + "type": "string", + "description": "The second prime factor for an RSA private key." + }, + "dp": { + "type": "string", + "description": "The Chinese Remainder Theorem (CRT) exponent of the first factor for an RSA private key." + }, + "dq": { + "type": "string", + "description": "The CRT exponent of the second factor for an RSA private key." + }, + "qi": { + "type": "string", + "description": "The CRT coefficient of the second factor for an RSA private key." + }, + "oth": { + "description": "An array of information about any third and subsequent primes, should they exist.", + "type": "array", + "items": { + "type": "object", + "properties": { + "r": { + "type": "string", + "description": "The prime factor." + }, + "d": { + "type": "string", + "description": "The factor CRT exponent of the corresponding prime factor." + }, + "t": { + "type": "string", + "description": "The factor CRT coefficient of the corresponding prime factor." + } + } + } + }, + "iv": { + "type": "string", + "description": "The base64url-encoded representation of the 96-bit Initialization Vector value used for the AES GCM key encryption operation." + }, + "tag": { + "type": "string", + "description": "The base64url-encoded representation of the 128-bit Authentication Tag value resulting from the AES GCM key encryption operation." + }, + "k": { + "type": "string", + "description": "The key value of the symmetric (or other single-valued) key." + }, + "enc": { + "type": "string", + "description": "The encryption algorithm for JWE." + }, + "epk": { + "type": "object", + "description": "The ephemeral public key value created by the originator for use in ECDH-ES key agreement algorithms." + }, + "apu": { + "type": "string", + "description": "The agreement PartyUInfo for ECDH-ES key agreement algorithms, containing information about the producer." + }, + "apv": { + "type": "string", + "description": "The agreement PartyVInfo for ECDH-ES key agreement algorithms." + } + } + }, + "JWKInline": { + "required": [ + "type", + "keys" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "INLINE" + ] + }, + "keys": { + "type": "array", + "description": "The JSON Web Keys.\n", + "items": { + "$ref": "#/components/schemas/JWK" + }, + "example": [ + { + "k": "ZmFudGFzdGljand0", + "kty": "oct", + "kid": 1 + } + ] + } + }, + "description": "Inline contents of a JWK JSON file.\n" + }, + "JWKRemoteFile": { + "required": [ + "uri", + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "REMOTE_FILE" + ] + }, + "uri": { + "type": "string" + }, + "cacheExpire": { + "pattern": "^[0-9]+[h|m|s]{1}$", + "type": "string", + "description": "The length of time for which to cache the remote file.\nNGINX will retrieve the file from the source URI when the cache time expires.\n", + "example": "10h" + } + } + }, + "IdentityProviderAPIKey": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "API_KEY" + ] + }, + "apiKey": { + "type": "string", + "description": "If left empty, a key will automatically be generated.\nThe apikey must contain only alphanumeric characters, underscores, and hyphens.\nThe length of the apikey must be between 8 - 256 characters.\n", + "example": "ADv-2ZheQnL_jVx5klhQ39" + } + } + }, + "CertMetadata": { + "type": "object", + "description": "Public certificate metadata.", + "required": [ + "authorityKeyIdentifier", + "commonName", + "expired", + "expiry", + "issuer", + "publicKeyType", + "serialNumber", + "signatureAlgorithm", + "subject", + "subjectAlternativeName", + "subjectKeyIdentifier", + "thumbprint", + "thumbprintAlgorithm", + "validFrom", + "validTo", + "version" + ], + "properties": { + "authorityKeyIdentifier": { + "type": "string", + "example": "2B D0 69 47 94 76 09 FE F4 6B 8D 2E 40 A6 F7 47 4D 7F 08 5E", + "description": "The identifier of the signing authority for the certificate." + }, + "commonName": { + "type": "string", + "example": "www.myapp.com", + "description": "The Common Name (CN) for the certificate. This is typically a Fully Qualified Domain Name (FQDN), and must be the same as the web address users access when connecting to a web site." + }, + "expired": { + "type": "boolean", + "example": false, + "description": "Indicates the expiration status of the certificate." + }, + "expiry": { + "type": "integer", + "example": 35500034, + "description": "The number of seconds until the certificate will expire." + }, + "issuer": { + "type": "string", + "example": "DigiCert Class 3 Extended Validation SSL SGC CA.", + "description": "Identifies the entity who signed and issued the certificate." + }, + "publicKeyType": { + "type": "string", + "example": "RSA (2048 Bits)", + "description": "Identifies the encryption algorithm used to create the public key for the ceritficate." + }, + "serialNumber": { + "type": "string", + "example": "16469416336579571270", + "description": "A unique identifier for the certificate." + }, + "signatureAlgorithm": { + "type": "string", + "example": "SHA-256", + "description": "Identifies the algorithm used to sign the certificate." + }, + "subject": { + "type": "string", + "example": "www.myapp.com", + "description": "Contains the Distinguished Name (DN) information for the certificate." + }, + "subjectAlternativeName": { + "type": "string", + "example": "DNS Name=static.xxxx", + "description": "Defines additional identifies bound to the subject of the certificate. For example, the DNS name is used to add addtional domain names to a certificate." + }, + "subjectKeyIdentifier": { + "type": "string", + "example": "31 EA 76 A9 23 74 A5 DF D4 FD EE A0 C1 A6 9E C6 11 0E 11 EC", + "description": "A hash value of the SSL certificate that can be used to identify certificates that contain a particular public key." + }, + "thumbprint": { + "type": "string", + "example": "E6 A7 87 96 E0 C7 A3 E5 43 78 35 CA 16 78 5B 48 5A A9 DD C4 5C CD 0A 65 AA 89 33 E3 C3 D0 89 71", + "description": "A hash to ensure that the certificate has not been modified." + }, + "thumbprintAlgorithm": { + "type": "string", + "example": "SHA-1", + "description": "Defines the algorithm used to hash the certificate." + }, + "validFrom": { + "type": "string", + "example": "2019-07-29T09:12:33.001Z", + "description": "The start of the validity period for the certificate." + }, + "validTo": { + "type": "string", + "example": "2029-07-29T09:12:33.001Z", + "description": "The end of the validity period for the certificate." + }, + "version": { + "type": "integer", + "example": 3, + "description": "The version of the certificate, typically 3 for X.509 certificates." + } + } + }, + "CertDesiredState": { + "type": "object", + "discriminator": { + "propertyName": "type", + "mapping": { + "PEM": "#/components/schemas/PEM", + "PKCS12": "#/components/schemas/PKCS12", + "REMOTE_FILE": "#/components/schemas/RemoteFile" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/PEM" + }, + { + "$ref": "#/components/schemas/PKCS12" + }, + { + "$ref": "#/components/schemas/RemoteFile" + } + ] + }, + "CertList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CertStatus" + } + } + } + }, + "CertStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/CertDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/CertCurrentStatus" + } + } + }, + "CertCurrentStatus": { + "type": "object", + "description": "'Shows the current status of the certificate.\n\nWhen any certificates have expired, the Certs service sets `state.selfConfigState.isConfigured` and `state.selfConfigState.isError` to `true`. The service will also add a value to the conditons array with the type \"expiration\" and a message that shows when the first certificate will expire. For example, `conditions: [{type: \"expiration\", message: \"Certificate www.example.com will expire in 29 days.\"}])`'\n", + "required": [ + "state", + "certMetadata", + "type" + ], + "properties": { + "type": { + "type": "string" + }, + "privateKey": { + "type": "string" + }, + "publicCert": { + "type": "string" + }, + "data": { + "type": "string" + }, + "password": { + "type": "string" + }, + "caCerts": { + "type": "array", + "items": { + "type": "string" + } + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "certMetadata": { + "type": "array", + "description": "Public certificate metadata.", + "items": { + "$ref": "#/components/schemas/CertMetadata" + } + } + } + }, + "Cert": { + "type": "object", + "description": "Contains the certificate to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/CertDesiredState" + } + } + }, + "PEM": { + "type": "object", + "description": "Defines a PEM-formatted certificate that contains a key and certificates.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\nThe private key data will be redacted in the response for all get and list requests.\n", + "required": [ + "privateKey", + "publicCert", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PEM" + ] + }, + "password": { + "type": "string", + "example": "myPa$$w0rd", + "description": "The passphrase to use to decrypt the private key. Required if the private key is encrypted." + }, + "privateKey": { + "type": "string", + "example": "-----BEGIN PRIVATE KEY-----\\n MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALSQBtRafNJtTqN0\\n nYiZq6TZUsHjfG2R9PlK6jsvno9O6amN96Al6ZSTTDjhr4VU7/RJ0p/cisiCboCX\\n 4cCq6lFKpIpeZJI=\\n -----END PRIVATE KEY-----", + "description": "The private key used to sign the public certificate.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`). The private key data will be redacted in the response for all get and list requests.\n" + }, + "publicCert": { + "type": "string", + "example": "-----BEGIN CERTIFICATE-----\\n MIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\n MiJVGawyxDzBm2UhzNOE0ABHfjAgM6PAYmtMhhQawk6bmttXYhJeqhLSji4LEj5d\\n Z4FmXQ5rWM0RWBs=\\n -----END CERTIFICATE-----", + "description": "The end-entity certificate, in PEM format.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n" + }, + "caCerts": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "-----BEGIN CERTIFICATE-----\\n MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh\\n WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf\\n SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==\\n -----END CERTIFICATE-----" + ], + "description": "An optional list of intermediate certificates in PEM format that are used to validate the public certificate.\n\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n" + } + } + }, + "PKCS12": { + "type": "object", + "description": "Defines a cert with key and certificates encoded in PKCS12 format.", + "required": [ + "data", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PKCS12" + ] + }, + "data": { + "type": "string", + "example": "MIIGoQIBAzCCBmcGCSqGSIb3DQEHAaCCBlgEggZUMIIGUDCCA08GCSqGSIb3DQEHBqCCA0AwggM8AgEAMIIDNQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIe7ZblBoEW3QCAggAgIIDCCgLEvzp9n69QbpGT0MDEwITAJBgUrDgMCGgUABBQJs6ZgeAMcxVLrq1hU+TlUOArMuQQIGK59vCBn0wECAggA", + "description": "A base-64-encoded string that contains a private key, a public certificate, and, optionally, other intermediate certificates." + }, + "password": { + "type": "string", + "example": "myPa$$w0rd", + "description": "The password to use to decrypt PKCS12 data." + } + } + }, + "RemoteFile": { + "type": "object", + "description": "Define a Cert resource by providing references to remote files.\n\n> **Note:** These are file path references only. The system can not validate the file contents or extract the certificate metadata. Providing a PEM or PKCS12 certificate is recommended.\n", + "required": [ + "privateKey", + "publicCert", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "REMOTE_FILE" + ] + }, + "privateKey": { + "type": "string", + "example": "/certs/www.example.com/example.key", + "description": "The path to the private key file." + }, + "publicCert": { + "type": "string", + "example": "/certs/www.example.com/example.crt", + "description": "The path to the certificate bundle file. The file must contain the public certificate and may contain additional intermediate certificates." + } + } + }, + "GatewayName": { + "type": "string" + }, + "GatewayList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Gateway" + } + } + } + }, + "GZip": { + "properties": { + "isEnabled": { + "type": "boolean", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip" + } + }, + "buffers": { + "type": "object", + "properties": { + "number": { + "type": "integer" + }, + "size": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + } + }, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_buffers" + } + }, + "level": { + "type": "integer", + "minimum": 1, + "maximum": 9, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_comp_level" + } + }, + "disabledUserAgents": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_disable" + } + }, + "httpVersion": { + "type": "string", + "pattern": "^[1-3]{1}\\.[0-1]{1}$", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version" + } + }, + "minLength": { + "type": "integer", + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_min_length" + } + }, + "proxied": { + "type": "string", + "enum": [ + "DISABLED", + "EXPIRED", + "NOCACHE", + "NOSTORE", + "PRIVATE", + "NOLASTMODIFIED", + "NOETAG", + "AUTH", + "ANY" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied" + } + }, + "mimeTypes": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_types" + } + }, + "vary": { + "type": "string", + "enum": [ + "DISABLED", + "ENABLED" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_vary" + } + }, + "static": { + "type": "string", + "enum": [ + "DISABLED", + "ENABLED", + "ALWAYS" + ], + "externalDocs": { + "url": "http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html#gzip_static" + } + } + } + }, + "Compression": { + "description": "Gzip compression settings.", + "type": "object", + "properties": { + "gzip": { + "$ref": "#/components/schemas/GZip" + } + } + }, + "GatewayWebState": { + "description": "Non-ingress settings in a Gateway that apply only to Web Components.", + "type": "object", + "properties": { + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + } + } + }, + "NginxDirective": { + "x-f5-experimental": true, + "required": [ + "directive" + ], + "properties": { + "directive": { + "type": "string", + "description": "The name of the NGINX directive. For a list of NGINX Directives, refer to [the NGINX documentation](http://nginx.org/en/docs/dirindex.html).\n" + }, + "args": { + "type": "array", + "description": "Directive arguments.", + "items": { + "type": "string" + } + }, + "block": { + "type": "array", + "description": "The directives to include within a block directive or context.", + "items": { + "$ref": "#/components/schemas/NginxDirective" + } + } + } + }, + "NginxConf": { + "x-f5-experimental": true, + "required": [ + "path", + "op", + "block" + ], + "properties": { + "path": { + "type": "string", + "description": "Path is a JSONPath expression. See [goessner.net/articles/JsonPath](https://goessner.net/articles/JsonPath/) for more information on JSONPath.\n", + "example": "$..[?(@.directive=='server')]" + }, + "op": { + "type": "string", + "description": "Indicates where to insert the block of directives in relation to the directives\nselected by the given path.\n\n* `APPEND` - Add after the selected directives\n\n* `APPEND_CHILD` - Add after the last directive in the selected directives' block\n\n* `PREPEND` - Add before the selected directives\n\n* `PREPEND_CHILD` - Add before the first directive in the selected directives' block\n", + "enum": [ + "APPEND", + "APPEND_CHILD", + "PREPEND", + "PREPEND_CHILD" + ] + }, + "block": { + "type": "array", + "description": "Block contains a list of directives that you want to add to the NGINX configuration.\n", + "items": { + "$ref": "#/components/schemas/NginxDirective" + } + } + } + }, + "NginxConfs": { + "x-f5-experimental": true, + "description": "NGINX raw configuration", + "type": "array", + "items": { + "$ref": "#/components/schemas/NginxConf" + } + }, + "HA": { + "description": "Data path high availability settings", + "type": "object", + "properties": { + "isEnabled": { + "type": "boolean", + "description": "Enables or disables HA.\n\nWhen set to `true`, supports configuring instances in an active‑passive, high‑availability (HA) setup.\n\nTo configure the gateway on HA mode:\n - `keepalived` must be installed and configured on the desired instances.\n - At least one listen IP address must be specified in the `listenIps` section within `InstanceRefs`\n\n See the `listenIps` section for additional requirements for configuring HA.\n" + } + } + }, + "GatewayStateCommon": { + "description": "Non-ingress settings in a Gateway that apply to Web and TCP/UDP Components.", + "type": "object", + "properties": { + "nginxConfs": { + "$ref": "#/components/schemas/NginxConfs" + }, + "ha": { + "$ref": "#/components/schemas/HA" + } + } + }, + "ServiceConfigState": { + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "default": "DISABLED" + }, + "GatewaySocketSettings": { + "description": "Socket settings in a Gateway.", + "type": "object", + "properties": { + "setFib": { + "x-f5-experimental": true, + "type": "integer" + }, + "fastOpen": { + "x-f5-experimental": true, + "type": "integer" + }, + "acceptFilter": { + "x-f5-experimental": true, + "type": "string", + "enum": [ + "DATA_READY", + "HTTP_READY" + ] + }, + "deferred": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "backlog": { + "x-f5-experimental": true, + "type": "integer", + "default": -1 + }, + "isIpv6Only": { + "x-f5-experimental": true, + "type": "boolean", + "default": false + }, + "reusePort": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "tcpKeepAlive": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "idle": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "interval": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "count": { + "type": "integer" + } + } + }, + "receiveBufferSize": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + }, + "sendBufferSize": { + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$" + } + } + }, + "URIMatchMethod": { + "description": "Specifies how to determine a match between an incoming Web URI and configured Web URI.", + "type": "string", + "enum": [ + "PREFIX", + "REGEX", + "REGEX_CASE_SENSITIVE", + "SUFFIX", + "EXACT" + ], + "default": "PREFIX" + }, + "TLS": { + "description": "TLS settings applicable to URIs.", + "type": "object", + "required": [ + "certRef" + ], + "properties": { + "certRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "protocols": { + "type": "array", + "items": { + "type": "string", + "pattern": "TLSv1|TLSv1\\.[1-3]|SSLv2|SSLv3" + } + }, + "cipher": { + "type": "string", + "example": "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;" + }, + "preferServerCipher": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "sessionCache": { + "type": "string", + "enum": [ + "OFF", + "NONE", + "BUILTIN", + "SHARED" + ], + "default": "OFF" + } + } + }, + "IngressUri": { + "type": "object", + "properties": { + "matchMethod": { + "$ref": "#/components/schemas/URIMatchMethod" + }, + "tls": { + "$ref": "#/components/schemas/TLS" + }, + "serverPoolPort": { + "x-f5-experimental": true, + "description": "The port number used when the IngressUri is deployed to an Instance that's a member of a BIG-IP server pool.", + "type": "integer" + } + } + }, + "IngressUris": { + "type": "object", + "description": "Defines the URI in Gateways and Components. The URI has different requirements depending on where it is used.\n\nFor Web URIs in Gateways, `uris` must be a complete URI that follows the format `://host[:port]`;\nadditionally each URI can have a match method specified and an HTTPS URI can include TLS information.\n Examples:\n - `http://www.f5.com`\n - `https://www.f5.com`\n - `http://www.f5.com:8080`\n - `http://*.info.f5.com`\n\nFor Web URIs in Components, `uris` can be either a complete URI that follows the format `://host[:port][/path]`\nor a relative path that follows the format `/path[/...]`;\nadditionally each URI can have a match method specified and an HTTPS URI can include TLS information.\n Examples:\n - `/images`\n - `/*.jpg`\n - `/locations/us/wa*`\n - `http://www.f5.com:8080/sales`\n - `http://*.f5.com:5050/testing`\n\nFor TCP/UDP URIs in Gateways and Components,`uris` must be a complete URI that follows the format `://<*|IP>:`;\nadditionally a tcp+tls URI can include TLS information. Match method is not applicable to TCP/UDP URIs.\n Examples:\n - `tcp://192.168.1.1:12345`\n - `tcp+tls://192.168.1.1:12346`\n - `tcp://192.168.1.1:12345-12350`\n - `tcp://*:12345`\n - `udp://192.168.1.1:12345`\n - `udp://*:12345`\n\nIn a TCP/UDP Component, URIs can either all have a protocol of udp or a mix of TCP and tcp+tls.\n", + "additionalProperties": { + "description": "Provide the URI associated with the resource.", + "$ref": "#/components/schemas/IngressUri" + } + }, + "InstanceGroupRef": { + "x-f5-experimental": true, + "allOf": [ + { + "$ref": "#/components/schemas/ResourceRef" + }, + { + "type": "object", + "properties": { + "listenIps": { + "x-f5-experimental": true, + "description": "The list of Listen IP addresses.\nSets the BIG-IP virtual address(es) on which the server listens for and accepts requests.\n", + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$", + "example": "1.1.1.1" + } + } + } + } + ] + }, + "Placement": { + "description": "Instances that have NGINX configuration applied corresponding to the Gateway and associated Components settings.", + "type": "object", + "properties": { + "instanceRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceRef" + } + }, + "instanceGroupRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroupRef" + } + } + } + }, + "GatewayIngressCommon": { + "description": "Ingress settings in a Gateway that apply to Web and TCP/UDP Components.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewaySocketSettings" + }, + { + "type": "object", + "required": [ + "uris", + "placement" + ], + "properties": { + "uris": { + "$ref": "#/components/schemas/IngressUris" + }, + "tls": { + "$ref": "#/components/schemas/TLS" + }, + "placement": { + "$ref": "#/components/schemas/Placement" + } + } + } + ] + }, + "HeaderMatchMethod": { + "type": "string", + "enum": [ + "PREFIX", + "REGEX", + "REGEX_CASE_SENSITIVE", + "SUFFIX", + "EXACT" + ], + "default": "REGEX" + }, + "IngressHeader": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "nameMatchMethod": { + "$ref": "#/components/schemas/HeaderMatchMethod" + }, + "value": { + "type": "string" + }, + "valueMatchMethod": { + "$ref": "#/components/schemas/HeaderMatchMethod" + } + } + }, + "WebIngressCommon": { + "description": "Ingress settings in a Gateway and Component that apply only to Web Components.", + "type": "object", + "properties": { + "methods": { + "description": "Specifies the HTTP method to use in requests.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "POST", + "GET", + "PUT", + "DELETE", + "PATCH", + "HEAD", + "TRACE", + "OPTIONS", + "CONNECT" + ] + } + }, + "clientMaxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.", + "type": "string", + "pattern": "^[0-9]+[k|K|m|M]{1}$", + "deprecated": true, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + }, + "headers": { + "description": "Specifies the match method for headers to be used in requests.", + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/IngressHeader" + } + }, + "http2": { + "description": "Enable or disable HTTP/2 connections on the port. Normally, for this to work the `ssl` parameter should be specified as well,\nbut NGINX can also be configured to accept HTTP/2 connections without SSL.\nPossible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "spdy": { + "description": "Enables or disables acceptance of the SPDY connections on the specified port.\nNormally, for this to work the `ssl` parameter should be specified as well,\nbut NGINX can also be configured to accept SPDY connections without SSL. Possible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "proxyProtocol": { + "description": "Enables or disables the proxy protocol for all connections accepted on the specified port.\nThe `proxy protocol` enables NGINX and NGINX Plus to receive client connection information passed through proxy servers and load balancers,\nsuch as HAproxy and Amazon Elastic Load Balancer (ELB). The possible values are `ENABLED` or `DISABLED`.\n", + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen" + } + }, + "notFoundStatusCode": { + "x-f5-experimental": true, + "type": "integer", + "default": 404 + }, + "headersHashBucketSize": { + "description": "Sets the bucket size for hash tables used by the `proxy_hide_header` and `proxy_set_header` directives.", + "type": "integer", + "minimum": 1, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_bucket_size" + } + }, + "headersHashMaxSize": { + "description": "Sets the maximum size of hash tables used by the `proxy_hide_header` and `proxy_set_header` directives.", + "type": "integer", + "minimum": 1, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_max_size" + } + } + } + }, + "GatewayWebIngressClient": { + "description": "Non-buffer settings in a Gateway applicable to Web client requests.", + "type": "object", + "properties": { + "bodyInFileOnly": { + "description": "Determines whether NGINX Controller should save the entire client request body into a file.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED", + "CLEAN" + ], + "default": "DISABLED", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only" + } + }, + "bodyTimeout": { + "description": "Defines a timeout for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout" + } + }, + "headerTimeout": { + "description": "Defines a timeout for reading the client request header.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout" + } + }, + "maxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.\n\nDisables checking of client request body size when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + } + } + }, + "WebIngressBuffersCommon": { + "description": "Buffer settings common to a Gateway and Component applicable to web client requests.", + "type": "object", + "properties": { + "clientBodyBufferingIsEnabled": { + "description": "Enables or disables buffering of a client request body.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering" + } + }, + "clientBodyBufferSize": { + "description": "Sets the buffer size for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size" + } + }, + "clientBodyInSingleBuffer": { + "description": "Determines whether NGINX Controller should save the entire client request body in a single buffer.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_single_buffer" + } + } + } + }, + "GatewayWebIngress": { + "description": "Ingress settings in a Gateway that apply only to Web Components.", + "type": "object", + "properties": { + "client": { + "$ref": "#/components/schemas/GatewayWebIngressClient" + }, + "allowUnderscoresInHeaders": { + "type": "boolean", + "default": false, + "description": "Allows the use of underscores in client request header fields.\n\nWhen set to `disabled`, request headers with names that contain underscores are considered invalid and are ignored.\n" + }, + "buffers": { + "allOf": [ + { + "$ref": "#/components/schemas/WebIngressBuffersCommon" + }, + { + "type": "object", + "properties": { + "clientHeaderBufferSize": { + "description": "Sets the buffer size for reading the client request header.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_buffer_size" + } + } + } + } + ] + } + } + }, + "GatewayIngress": { + "description": "Ingress settings in a Gateway.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayIngressCommon" + }, + { + "$ref": "#/components/schemas/WebIngressCommon" + }, + { + "$ref": "#/components/schemas/GatewayWebIngress" + } + ] + }, + "GatewayDesiredState": { + "description": "The desired gateway settings that the user wants in the configuration on NGINX instances referenced by this Gateway.", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayWebState" + }, + { + "$ref": "#/components/schemas/GatewayStateCommon" + }, + { + "type": "object", + "required": [ + "ingress" + ], + "properties": { + "ingress": { + "$ref": "#/components/schemas/GatewayIngress" + } + } + } + ] + }, + "ErrorSetList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorSet" + } + } + } + }, + "ErrorSet": { + "type": "object", + "description": "Defines the set of error messages to be returned for HTTP errors.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/ErrorSetDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/ErrorSetCurrentStatus" + } + } + }, + "ErrorSetDesiredState": { + "type": "object", + "properties": { + "errorCodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorCode" + } + } + } + }, + "ErrorSetCurrentStatus": { + "type": "object", + "properties": { + "errorCodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorCode" + } + } + } + }, + "ErrorCode": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "minimum": 400, + "maximum": 599, + "example": 404 + }, + "message": { + "type": "string", + "example": "{\"status\":404,\"message\":\"Resource not found\"}" + } + } + }, + "PublishedAPIList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PublishedAPI" + } + } + } + }, + "PublishedAPI": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/PublishedAPICurrentStatus" + }, + "desiredState": { + "$ref": "#/components/schemas/PublishedAPIDesiredState" + } + } + }, + "PublishedAPICurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "basePath": { + "type": "string", + "default": "/" + }, + "stripWorkloadBasePath": { + "type": "boolean", + "default": true + }, + "componentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "apiDefinitionVersionRef": { + "description": "Reference to the Version of the API Definition.\n", + "$ref": "#/components/schemas/ResourceRef" + }, + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateway associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devportalRefs": { + "type": "array", + "description": "Reference to the Dev Portal associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "PublishedAPIDesiredState": { + "type": "object", + "required": [ + "apiDefinitionVersionRef", + "gatewayRefs" + ], + "properties": { + "basePath": { + "type": "string", + "default": "/" + }, + "stripWorkloadBasePath": { + "type": "boolean", + "default": true + }, + "apiDefinitionVersionRef": { + "description": "Reference to the Version of the API Definition.\n", + "$ref": "#/components/schemas/ResourceRef" + }, + "gatewayRefs": { + "type": "array", + "description": "Reference to the Gateway associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "devportalRefs": { + "type": "array", + "description": "Reference to the Dev Portal associated with the Published API.", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "ComponentList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Component" + } + } + } + }, + "ComponentStateCommon": { + "type": "object", + "description": "Settings common to Web & TCP/UDP Components.", + "properties": { + "nginxConfs": { + "$ref": "#/components/schemas/NginxConfs" + } + } + }, + "ComponentIngressCommon": { + "description": "Ingress settings common to Web and TCP/UDP components.", + "type": "object", + "required": [ + "uris" + ], + "properties": { + "uris": { + "$ref": "#/components/schemas/IngressUris" + }, + "gatewayRefs": { + "description": "Reference(s) to existing Gateway resource(s).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "tls": { + "$ref": "#/components/schemas/TLS" + } + } + }, + "ComponentWebIngressClient": { + "description": "Non-buffer settings in a Component applicable to Web client requests.", + "type": "object", + "properties": { + "bodyInFileOnly": { + "description": "Determines whether NGINX Controller should save the entire client request body into a file.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED", + "CLEAN" + ], + "default": "DISABLED", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only" + } + }, + "bodyTimeout": { + "description": "Defines a timeout for reading the client request body.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout" + } + }, + "maxBodySize": { + "description": "Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field.\n\nDisables checking of client request body size when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size" + } + } + } + }, + "ComponentWebIngress": { + "description": "Ingress settings in a Web Component.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentIngressCommon" + }, + { + "$ref": "#/components/schemas/WebIngressCommon" + }, + { + "type": "object", + "properties": { + "client": { + "$ref": "#/components/schemas/ComponentWebIngressClient" + }, + "buffers": { + "$ref": "#/components/schemas/WebIngressBuffersCommon" + } + } + } + ] + }, + "MonitoringCommon": { + "description": "Monitor settings common to Web and TCP/UDP.", + "type": "object", + "properties": { + "defaultState": { + "type": "string", + "enum": [ + "HEALTHY", + "UNHEALTHY" + ], + "default": "HEALTHY" + }, + "interval": { + "type": "integer", + "minimum": 1, + "default": 5 + }, + "consecutiveSuccessThreshold": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "consecutiveFailureThreshold": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "port": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + } + }, + "MonitorResponseStatus": { + "type": "object", + "properties": { + "range": { + "type": "object", + "properties": { + "startCode": { + "type": "integer", + "minimum": 100, + "maximum": 599 + }, + "endCode": { + "type": "integer", + "minimum": 100, + "maximum": 599 + } + } + }, + "codes": { + "type": "array", + "items": { + "type": "integer", + "minimum": 100, + "maximum": 599 + } + }, + "match": { + "type": "boolean", + "default": true + } + } + }, + "MonitorResponseContent": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "match": { + "type": "boolean", + "default": true + } + } + }, + "WebMonitorResponse": { + "description": "Settings that define successful responses to a Web monitor.", + "type": "object", + "properties": { + "status": { + "$ref": "#/components/schemas/MonitorResponseStatus" + }, + "headers": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/MonitorResponseContent" + } + }, + "body": { + "$ref": "#/components/schemas/MonitorResponseContent" + } + } + }, + "WebMonitoring": { + "description": "Health monitor settings across all workload groups in a Web Component.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitoringCommon" + }, + { + "type": "object", + "properties": { + "uri": { + "description": "URI containing the relative path that the monitor probe is sent to; the host is specified in the URI in the workload group.", + "type": "string", + "default": "/" + }, + "response": { + "description": "Settings that define successful responses to a Web monitor.", + "$ref": "#/components/schemas/WebMonitorResponse" + } + } + } + ] + }, + "RoundRobinLB": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ROUND_ROBIN" + ] + } + } + }, + "IPHashLB": { + "type": "object", + "description": "IP Hash Load Balancing only applicable to Web Components.", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IPHASH" + ] + } + } + }, + "LeastConnLB": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "LEAST_CONNECTIONS" + ] + } + } + }, + "HashLBMethod": { + "type": "object", + "required": [ + "type", + "userKey" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "HASH" + ] + }, + "userKey": { + "type": "string" + }, + "consistentHash": { + "$ref": "#/components/schemas/ServiceConfigState" + } + } + }, + "LeastTimeLBMethod": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "LEAST_TIME" + ] + }, + "latencyParameter": { + "type": "string", + "description": "Values applicable to a Web Component are: [HEADER, LAST_BYTE, LAST_BYTE_INFLIGHT];\nValues applicable to a TCP/UDP Component are: [CONNECT, FIRST_BYTE, LAST_BYTE, LAST_BYTE_INFLIGHT].\nThe default value is used for a web Component; there is no default for a TCP/UDP Component.\n", + "enum": [ + "HEADER", + "CONNECT", + "FIRST_BYTE", + "LAST_BYTE", + "LAST_BYTE_INFLIGHT" + ], + "default": "HEADER" + } + } + }, + "RandomLBMethod": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "RANDOM" + ] + }, + "twoServerLBMethod": { + "type": "string", + "description": "Values applicable to a Web Component are: [LEAST_CONNECTIONS, LEAST_TIME_HEADER, LEAST_TIME_LAST_BYTE];\nValues applicable to a TCP/UDP Component are: [LEAST_CONNECTIONS, LEAST_TIME_CONNECT, LEAST_TIME_FIRST_BYTE, LEAST_TIME_LAST_BYTE].\n", + "enum": [ + "LEAST_CONNECTIONS", + "LEAST_TIME_HEADER", + "LEAST_TIME_CONNECT", + "LEAST_TIME_FIRST_BYTE", + "LEAST_TIME_LAST_BYTE" + ] + } + } + }, + "LoadBalancingMethod": { + "discriminator": { + "propertyName": "type", + "mapping": { + "ROUND_ROBIN": "#/components/schemas/RoundRobinLB", + "IPHASH": "#/components/schemas/IPHashLB", + "LEAST_CONNECTIONS": "#/components/schemas/LeastConnLB", + "HASH": "#/components/schemas/HashLBMethod", + "LEAST_TIME": "#/components/schemas/LeastTimeLBMethod", + "RANDOM": "#/components/schemas/RandomLBMethod" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/RoundRobinLB" + }, + { + "$ref": "#/components/schemas/IPHashLB" + }, + { + "$ref": "#/components/schemas/LeastConnLB" + }, + { + "$ref": "#/components/schemas/HashLBMethod" + }, + { + "$ref": "#/components/schemas/LeastTimeLBMethod" + }, + { + "$ref": "#/components/schemas/RandomLBMethod" + } + ] + }, + "DNSServiceDiscovery": { + "required": [ + "servers" + ], + "properties": { + "servers": { + "type": "array", + "description": "Array of DNS servers. Possible options are:\n- An IPv4 address with an optional port number.\n Port 53 is used if not specified.\n For example, \"10.1.1.1\", \"10.1.1.1:5353\".\n- An IPv6 address with an optional port number.\n Port 53 is used if not specified.\n For example, \"[2001::1]\", \"[2001::1]:5353\",\n- Fully qualified domain name (FQDN). ASCII characters only.\n NGINX uses the OS name server configuration\n to identify the IP addresses of the DNS servers to use.\n", + "items": { + "type": "string", + "pattern": "^(?:(?:(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(?::(?:[1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5]))?$)|(?:\\[\\s*(?:(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))|(?:(?:[0-9a-fA-F]{1,4}:){6}(?::[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-fA-F]{1,4}:){5}(?:(?:(?::[0-9a-fA-F]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-fA-F]{1,4}:){4}(?:(?:(?::[0-9a-fA-F]{1,4}){1,3})|(?:(?::[0-9a-fA-F]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){3}(?:(?:(?::[0-9a-fA-F]{1,4}){1,4})|(?:(?::[0-9a-fA-F]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){2}(?:(?:(?::[0-9a-fA-F]{1,4}){1,5})|(?:(?::[0-9a-fA-F]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-fA-F]{1,4}:){1}(?:(?:(?::[0-9a-fA-F]{1,4}){1,6})|(?:(?::[0-9a-fA-F]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-fA-F]{1,4}){1,7})|(?:(?::[0-9a-fA-F]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?](?::(?:[1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5]))?\\s*$)|(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*$))", + "minLength": 1, + "example": "10.1.1.1:5353" + }, + "minItems": 1, + "uniqueItems": true + }, + "ttl": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "description": "Overrides the TTL setting present in the DNS record.", + "example": "10s" + }, + "timeout": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "description": "Sets the timeout for domain name resolution.", + "example": "10s" + } + } + }, + "WorkloadGroupCommon": { + "description": "Settings common to Web and TCP/UDP workloadGroups.", + "type": "object", + "properties": { + "locationRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "loadBalancingMethod": { + "$ref": "#/components/schemas/LoadBalancingMethod" + }, + "dnsServiceDiscovery": { + "$ref": "#/components/schemas/DNSServiceDiscovery" + } + } + }, + "WebProxy": { + "description": "Proxy retry and timeout settings applicable to servers in a Web workloadGroup associated with a Component.", + "type": "object", + "properties": { + "nextUpstream": { + "description": "Specifies in which cases a request should be passed to the next server.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "ERROR", + "TIMEOUT", + "INVALID_HEADER", + "HTTP_500", + "HTTP_502", + "HTTP_503", + "HTTP_504", + "HTTP_403", + "HTTP_404", + "HTTP_429", + "NON_IDEMPOTENT", + "OFF" + ] + } + }, + "connectTimeout": { + "description": "Defines a timeout for establishing a connection with a proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + }, + "sendTimeout": { + "description": "Sets a timeout for transmitting a request to the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + } + } + }, + "SessionPersistenceCookie": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "COOKIE" + ] + }, + "srvID": { + "type": "string" + }, + "expireTime": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "domain": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "SessionPersistenceRoute": { + "type": "object", + "required": [ + "type", + "routeInfoLocation" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ROUTE" + ] + }, + "routeInfoLocation": { + "type": "string", + "enum": [ + "COOKIE", + "URI", + "BOTH" + ] + } + } + }, + "SessionPersistenceCookieLearn": { + "type": "object", + "required": [ + "type", + "create", + "lookup" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "COOKIE_LEARN" + ] + }, + "create": { + "type": "string", + "pattern": "^\\$.+" + }, + "lookup": { + "type": "string", + "pattern": "^\\$.+" + } + } + }, + "SessionPersistence": { + "description": "SessionPersistence settings in a Web workloadGroup.", + "discriminator": { + "propertyName": "type", + "mapping": { + "COOKIE": "#/components/schemas/SessionPersistenceCookie", + "ROUTE": "#/components/schemas/SessionPersistenceRoute", + "COOKIE_LEARN": "#/components/schemas/SessionPersistenceCookieLearn" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SessionPersistenceCookie" + }, + { + "$ref": "#/components/schemas/SessionPersistenceRoute" + }, + { + "$ref": "#/components/schemas/SessionPersistenceCookieLearn" + } + ] + }, + "WorkloadUri": { + "type": "object", + "properties": { + "weight": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "maxConns": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "maxFails": { + "type": "integer", + "minimum": 0, + "default": 1 + }, + "failTimeout": { + "x-f5-experimental": true, + "type": "string", + "default": "10s", + "pattern": "^[0-9]+[h|m|s]{1}$" + }, + "isBackup": { + "type": "boolean", + "default": false + }, + "isDown": { + "type": "boolean", + "default": false + }, + "route": { + "x-f5-experimental": true, + "type": "string" + }, + "srvService": { + "type": "string" + }, + "slowStart": { + "x-f5-experimental": true, + "type": "integer", + "minimum": 0, + "default": 0 + }, + "isDrain": { + "type": "boolean", + "default": false + } + } + }, + "WebWorkloadGroup": { + "description": "Group of servers hosting a part of a Web application represented by a Component.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkloadGroupCommon" + }, + { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/components/schemas/WebProxy" + }, + "sessionPersistence": { + "$ref": "#/components/schemas/SessionPersistence" + }, + "uris": { + "type": "object", + "description": "The URI for a server hosting a part of a Web application.\n\nIt must conform to the format `schema://address[:port]`\nwhere schema is chosen from http or https, address is IP or hostname,\nschema and address must be provided.\n\nFor example:\n\n- `http://192.0.2.247`\n- `https://192.0.2.247:8443`\n- `https://www.f5workload.com`\n", + "additionalProperties": { + "$ref": "#/components/schemas/WorkloadUri" + } + } + } + } + ] + }, + "BackendBuffers": { + "description": "Proxy buffer settings applicable to servers across all Web workloadGroups associated with a Component.", + "type": "object", + "properties": { + "headerSize": { + "description": "Sets the size of the buffer used for reading the first part of the response received from the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size" + } + }, + "isEnabled": { + "description": "Enables or disables buffering of responses from the proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering" + } + }, + "size": { + "description": "Sets the number and size of the buffers used for reading a response from the proxied server, for a single connection.", + "type": "object", + "properties": { + "number": { + "type": "integer" + }, + "size": { + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$" + } + }, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers" + } + }, + "busySize": { + "description": "When buffering of responses from the proxied server is enabled, it limits the total size of buffers that can be busy sending a response to the client while the response is not yet fully read.", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_busy_buffers_size" + } + }, + "ignoreClientAbort": { + "description": "Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort" + } + }, + "forceRanges": { + "description": "Enables byte-range support for both cached and uncached responses from the proxied server regardless of the \"Accept-Ranges\" field in these responses.", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_force_ranges" + } + }, + "httpVersion": { + "description": "Sets the HTTP protocol version for proxying.", + "type": "string", + "enum": [ + "1.0", + "1.1" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version" + } + }, + "rate": { + "description": "Limits the speed (in bytes per second) of reading the response from the proxied server.\n\nDisables rate limiting when set to 0. \n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_limit_rate" + } + }, + "readTimeout": { + "description": "Defines a timeout for reading a response from the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout" + } + }, + "maxTempFileSize": { + "description": "Sets the maximum size of the temporary file that the response can be saved into. Note that the buffering of responses from proxied server is enabled and the response does not fit into the buffers.\n\nDisables temporary file usage when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size" + } + }, + "tempFileWriteSize": { + "description": "Limits the size of data written to a temporary file at a time, when buffering of responses from the proxied server to temporary files is enabled.\n\nDisables temporary file usage when set to 0.\n", + "type": "string", + "pattern": "^[0-9]{1,12}[kKmM]?$", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_file_write_size" + } + } + } + }, + "WebBackend": { + "description": "Backend settings in a Web Component.\n", + "type": "object", + "properties": { + "keepAlive": { + "type": "object", + "properties": { + "connections": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "requestsPerConn": { + "type": "integer" + }, + "idleTimeout": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "example": "1h" + } + } + }, + "monitoring": { + "$ref": "#/components/schemas/WebMonitoring" + }, + "workloadGroups": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/WebWorkloadGroup" + } + }, + "preserveHostHeader": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "queue": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "length" + ], + "properties": { + "length": { + "type": "integer" + }, + "timeOut": { + "type": "string", + "pattern": "^[0-9]+[h|m|s]{1}$", + "example": "1h" + } + } + }, + "httpVersion": { + "x-f5-experimental": true, + "type": "string", + "pattern": "^[1-3]{1}\\.[0-1]{1}$", + "example": 1 + }, + "ntlmAuthentication": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "persistentState": { + "x-f5-experimental": true, + "type": "string" + }, + "buffers": { + "$ref": "#/components/schemas/BackendBuffers" + }, + "isSocketKeepaliveEnabled": { + "description": "Configures the “TCP keepalive” behavior for outgoing connections to a proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_socket_keepalive" + } + }, + "ignoreHeaders": { + "description": "Disables processing of certain response header fields from the proxied server.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "X-Accel-Redirect", + "X-Accel-Expires", + "X-Accel-Limit-Rate", + "X-Accel-Buffering", + "X-Accel-Charset", + "Expires", + "Cache-Control", + "Set-Cookie", + "Vary" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers" + } + }, + "debugHeaders": { + "description": "Permits passing otherwise disabled header fields from a proxied server to a client.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "X-Accel-Redirect", + "X-Accel-Expires", + "X-Accel-Limit-Rate", + "X-Accel-Buffering", + "X-Accel-Charset", + "Expires", + "Cache-Control", + "Set-Cookie", + "Vary" + ], + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_header" + } + }, + "tls": { + "description": "TLS settings applicable to servers in Web workloadGroups.", + "type": "object", + "properties": { + "cipher": { + "description": "Specifies the enabled ciphers for requests to a proxied HTTPS server.", + "type": "string", + "example": "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_ciphers" + } + }, + "name": { + "description": "Allows overriding the server name used to verify the certificate of the proxied HTTPS server.", + "type": "string", + "example": "$proxy_host", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_name" + } + }, + "protocols": { + "description": "Enables the specified protocols for requests to a proxied HTTPS server.", + "type": "array", + "items": { + "type": "string", + "pattern": "TLSv1|TLSv1\\.[1-3]|SSLv2|SSLv3" + }, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_protocols" + } + }, + "isServerNameEnabled": { + "description": "Enables or disables passing of the server name through TLS Server Name Indication extension (SNI, RFC 6066) when establishing a connection with the proxied HTTPS server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name" + } + }, + "isSessionReuseEnabled": { + "description": "Determines whether SSL sessions can be reused when working with the proxied server.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_session_reuse" + } + }, + "isVerifiedEnabled": { + "description": "Enables or disables verification of the proxied HTTPS server certificate.", + "type": "boolean", + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify" + } + }, + "verifyDepth": { + "description": "Sets the verification depth in the proxied HTTPS server certificates chain.", + "type": "integer", + "minimum": 0, + "externalDocs": { + "url": "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify_depth" + } + } + } + } + } + }, + "ApplicableUri": { + "type": "object", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string" + }, + "matchMethod": { + "$ref": "#/components/schemas/URIMatchMethod" + } + } + }, + "ApplicableUris": { + "type": "array", + "description": "Defines an array of ingress URIs with a corresponding matchMethod that this rewrite rule applies to.\nBy default, a rewrite rule applies to all of the ingress URIs in the component.\nA rewrite rule can also be applied at a gateway level by specifying ingress URIs\nfrom the gateway. For example \"http://www.nginx.com\". Note that applying the rewrite\nrule to URIs at a gateway level can affect other components. The URI and the matchMethod must\nmatch an ingress URI defined either at the component or gateway level. If no match is found\nthe request is rejected.\n", + "items": { + "$ref": "#/components/schemas/ApplicableUri" + } + }, + "UriRewrite": { + "type": "object", + "required": [ + "incomingPattern", + "rewritePattern" + ], + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + }, + "incomingPattern": { + "type": "string", + "description": "The regex pattern to match against the request URIs that are expected to be rewritten." + }, + "rewritePattern": { + "type": "string", + "description": "The replacement regex pattern to apply to the URIs that are to be rewritten.", + "minLength": 1 + }, + "afterExecute": { + "type": "string", + "enum": [ + "NONE", + "LAST", + "BREAK", + "REDIRECT", + "PERMANENT" + ], + "default": "BREAK" + } + } + }, + "UriRedirect": { + "type": "object", + "required": [ + "responseCode" + ], + "properties": { + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + }, + "responseCode": { + "type": "integer", + "minimum": 300, + "maximum": 308 + }, + "url": { + "type": "string", + "minLength": 1, + "description": "The return url to use for responses in the 301-308 range." + }, + "text": { + "type": "string", + "description": "The return text to send for 300 responses." + } + } + }, + "ProgrammabilityAction": { + "type": "string", + "enum": [ + "ADD", + "MODIFY", + "DELETE" + ] + }, + "CookieModification": { + "type": "object", + "required": [ + "action", + "cookieName" + ], + "properties": { + "action": { + "$ref": "#/components/schemas/ProgrammabilityAction" + }, + "cookieName": { + "type": "string" + }, + "cookieValue": { + "type": "string" + } + } + }, + "ProgrammabilityAddRequestHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds request header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the request header.", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ProgrammabilityDeleteRequestHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes request header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the request header to modify.", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "RequestHeaderModification": { + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/ProgrammabilityAddRequestHeader", + "DELETE": "#/components/schemas/ProgrammabilityDeleteRequestHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ProgrammabilityAddRequestHeader" + }, + { + "$ref": "#/components/schemas/ProgrammabilityDeleteRequestHeader" + } + ] + }, + "ProgrammabilityAddResponseHeader": { + "type": "object", + "required": [ + "action", + "headerName", + "headerValue" + ], + "properties": { + "action": { + "type": "string", + "description": "Adds response header details.", + "enum": [ + "ADD" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.", + "minLength": 1 + }, + "headerValue": { + "type": "string", + "description": "The value to apply to the response header.", + "minLength": 1 + }, + "responseCodeFilter": { + "type": "string", + "description": "The value to apply to the response code filter.", + "enum": [ + "ALWAYS", + "PRE_DEFINED" + ], + "default": "PRE_DEFINED" + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ProgrammabilityDeleteResponseHeader": { + "type": "object", + "required": [ + "action", + "headerName" + ], + "properties": { + "action": { + "type": "string", + "description": "Deletes response header details.", + "enum": [ + "DELETE" + ] + }, + "headerName": { + "type": "string", + "description": "The name of the response header to modify.\n\n> Warning: `Date`, `Content-Length`, and `Connection` headers cannot be deleted.\n", + "minLength": 1 + }, + "applicableURIs": { + "$ref": "#/components/schemas/ApplicableUris" + } + } + }, + "ResponseHeaderModification": { + "discriminator": { + "propertyName": "action", + "mapping": { + "ADD": "#/components/schemas/ProgrammabilityAddResponseHeader", + "DELETE": "#/components/schemas/ProgrammabilityDeleteResponseHeader" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ProgrammabilityAddResponseHeader" + }, + { + "$ref": "#/components/schemas/ProgrammabilityDeleteResponseHeader" + } + ] + }, + "Programmability": { + "type": "object", + "properties": { + "uriRewrites": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UriRewrite" + } + }, + "httpHttpsRedirect": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + }, + "uriRedirects": { + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/UriRedirect" + } + }, + "cookieModifications": { + "x-f5-experimental": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/CookieModification" + } + }, + "requestHeaderModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RequestHeaderModification" + } + }, + "responseHeaderModifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResponseHeaderModification" + } + } + } + }, + "Logging": { + "description": "Settings for error logs and access logs.", + "type": "object", + "properties": { + "errorLog": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "accessLog": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ServiceConfigState" + }, + "format": { + "type": "string" + } + } + } + } + }, + "WAF": { + "description": "Defines the desired configurations for the WAF associated with the application component.", + "properties": { + "isEnabled": { + "type": "boolean", + "default": true, + "description": "Indicates whether the WAF is enabled or not." + }, + "isMonitorOnly": { + "type": "boolean", + "default": true, + "description": "Indicates whether the WAF will monitor or block security violations." + }, + "signatureOverrides": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "IGNORE" + ] + } + }, + "description": "Identifies overrides for the signatures contained within the associated security strategy.\n", + "example": { + "1234": { + "action": "IGNORE" + }, + "1235": { + "action": "IGNORE" + } + } + } + } + } + }, + "APIKeyClientAuth": { + "description": "Defines how an API client should provide their API Key credentials.", + "required": [ + "keyLocation" + ], + "properties": { + "keyLocation": { + "type": "string", + "enum": [ + "HEADER", + "QUERY_PARAM" + ] + }, + "key": { + "type": "string" + } + } + }, + "JWTClientAuth": { + "description": "Defines how an API Client should provide their JWT.", + "required": [ + "keyLocation" + ], + "properties": { + "keyLocation": { + "type": "string", + "enum": [ + "BEARER", + "HEADER", + "QUERY_PARAM", + "COOKIE" + ] + }, + "key": { + "type": "string" + } + } + }, + "ConditionalAuthPolicy": { + "description": "Defines further fine-grained access control on top of API Key or JWT Auth.", + "required": [ + "sourceType", + "comparisonType", + "comparisonValues", + "action", + "denyStatusCode" + ], + "properties": { + "sourceType": { + "type": "string", + "enum": [ + "HEADER", + "JWT_CLAIM" + ] + }, + "sourceKey": { + "type": "string" + }, + "comparisonType": { + "type": "string", + "enum": [ + "EQUALS", + "NOT_EQUALS", + "IN", + "CONTAINS" + ] + }, + "comparisonValues": { + "type": "array", + "description": "Valid values for the sourceType.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + } + }, + "action": { + "type": "string", + "enum": [ + "ALLOW", + "DENY" + ] + }, + "denyStatusCode": { + "type": "integer" + } + } + }, + "RateLimit": { + "required": [ + "rate" + ], + "properties": { + "rate": { + "type": "string", + "pattern": "^[0-9]+r\\/[m|s]{1}$", + "description": "Sets the maximum number of allowed requests.\n\nYou can specify the rate limit as requests per second (r/s) or requests per minute (r/m).\n", + "example": "10r/s" + }, + "burstBeforeReject": { + "type": "integer", + "minimum": 0 + }, + "burstBeforeDelay": { + "type": "integer", + "minimum": 0 + }, + "statusCode": { + "type": "integer", + "default": 429 + }, + "key": { + "type": "string", + "default": "$binary_remote_addr", + "description": "Parameters (NGINX variable) for a shared memory zone that stores states for various keys; used for `limit_req_zone`." + } + } + }, + "Security": { + "type": "object", + "description": "Defines the desired security configurations for the application component.", + "properties": { + "strategyRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "waf": { + "$ref": "#/components/schemas/WAF" + }, + "identityProviderRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + }, + "description": "The list of Identity Providers that are used in this Security policy." + }, + "apiKeyClientAuth": { + "$ref": "#/components/schemas/APIKeyClientAuth" + }, + "jwtClientAuth": { + "$ref": "#/components/schemas/JWTClientAuth" + }, + "conditionalAuthPolicies": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ConditionalAuthPolicy" + } + }, + "rateLimits": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/RateLimit" + } + }, + "interceptWorkloadErrors": { + "x-f5-experimental": true, + "$ref": "#/components/schemas/ServiceConfigState" + } + } + }, + "PublishedApiRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "ComponentWebDesiredState": { + "description": "The desired settings in the Web Component that the user wants in the configuration on NGINX instances associated with\nthe Gateways which this component references.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "required": [ + "ingress", + "backend" + ], + "properties": { + "componentType": { + "description": "Defines the Component type. The default type is Web.", + "type": "string", + "enum": [ + "WEB" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentWebIngress" + }, + "backend": { + "$ref": "#/components/schemas/WebBackend" + }, + "programmability": { + "$ref": "#/components/schemas/Programmability" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "security": { + "$ref": "#/components/schemas/Security" + }, + "publishedApiRefs": { + "$ref": "#/components/schemas/PublishedApiRefs" + }, + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + } + } + } + ] + }, + "ComponentTcpUdpIngress": { + "description": "Ingress settings in a TCP/UDP Component.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentIngressCommon" + } + ] + }, + "TcpUdpMonitoring": { + "description": "Health monitor settings across all workload groups in a TCP/UDP Component.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitoringCommon" + }, + { + "type": "object", + "properties": { + "send": { + "description": "Probe request for a TCP/UDP monitor.", + "type": "string" + }, + "response": { + "description": "Case-sensitive regular expression for the expected success response to a TCP/UDP monitor.", + "type": "string" + } + } + } + ] + }, + "TcpUdpProxy": { + "description": "Proxy retry and timeout settings applicable to servers in a TcpUdp workloadGroup associated with a Component.", + "type": "object", + "properties": { + "nextUpstream": { + "description": "When a connection to the proxied server cannot be established, determines whether a client connection will be passed to the next server.", + "type": "string", + "enum": [ + "ON", + "OFF" + ], + "default": "OFF" + }, + "connectTimeout": { + "description": "Defines a timeout for establishing a connection with the proxied server.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + }, + "proxyTimeout": { + "description": "Sets the timeout between two successive read or write operations on client or proxied server connections.", + "type": "string", + "pattern": "^[0-9]{1,12}[hms]?$" + } + } + }, + "TcpUdpWorkloadGroup": { + "description": "Group of servers hosting a part of a TCP/UDP application represented by a Component.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkloadGroupCommon" + }, + { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/components/schemas/TcpUdpProxy" + }, + "uris": { + "type": "object", + "description": "The URI for a server hosting a part of a TCP/UDP application.\n\nThe URI must conform to the format `schema://address:port`\nwhere schema is chosen from tcp, udp, or tcp+tls, address is IP or hostname.\nAll three of schema, address, and port must be provided.\n\nFor example:\n\n- `tcp://192.0.2.247:8443`\n- `tcp+tls://192.0.2.247:8449`\n- `udp://www.f5workload.com:989`\n", + "additionalProperties": { + "$ref": "#/components/schemas/WorkloadUri" + } + } + } + } + ] + }, + "TcpUdpBackend": { + "description": "Backend settings in a TCP/UDP Component.\n", + "type": "object", + "properties": { + "monitoring": { + "$ref": "#/components/schemas/TcpUdpMonitoring" + }, + "workloadGroups": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TcpUdpWorkloadGroup" + } + } + } + }, + "ComponentTcpUdpDesiredState": { + "description": "The desired settings in the TCP/UDP Component to use in the configuration on NGINX instances associated with the Gateways that this Component references.", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "required": [ + "componentType", + "ingress", + "backend" + ], + "properties": { + "componentType": { + "description": "Defines what type of Component this is. The type must be TCPUDP.", + "type": "string", + "enum": [ + "TCPUDP" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentTcpUdpIngress" + }, + "backend": { + "$ref": "#/components/schemas/TcpUdpBackend" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + } + } + } + ] + }, + "ComponentDesiredState": { + "description": "The desired component settings to use in the NGINX instance configuration that's associated with\nthe Gateways that this component references.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/ComponentWebDesiredState" + }, + { + "$ref": "#/components/schemas/ComponentTcpUdpDesiredState" + } + ] + }, + "ComponentWebCurrentStatus": { + "description": "The current snapshot of the web component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "properties": { + "componentType": { + "description": "Defines what type of Component this is.", + "type": "string", + "enum": [ + "WEB" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentWebIngress" + }, + "backend": { + "$ref": "#/components/schemas/WebBackend" + }, + "programmability": { + "$ref": "#/components/schemas/Programmability" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "security": { + "$ref": "#/components/schemas/Security" + }, + "publishedApiRefs": { + "$ref": "#/components/schemas/PublishedApiRefs" + }, + "errorSetRef": { + "$ref": "#/components/schemas/ResourceRef" + }, + "compression": { + "$ref": "#/components/schemas/Compression" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "ComponentTcpUdpCurrentStatus": { + "description": "The current snapshot of the TCP/UDP component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/ComponentStateCommon" + }, + { + "type": "object", + "properties": { + "componentType": { + "description": "Defines what type of Component this is.", + "type": "string", + "enum": [ + "TCPUDP" + ] + }, + "ingress": { + "$ref": "#/components/schemas/ComponentTcpUdpIngress" + }, + "backend": { + "$ref": "#/components/schemas/TcpUdpBackend" + }, + "logging": { + "$ref": "#/components/schemas/Logging" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + }, + "ComponentCurrentStatus": { + "description": "The current snapshot of the component settings that are reflected in the configuration on NGINX instances associated with\nthe Gateways that this Component references.\n\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/ComponentWebCurrentStatus" + }, + { + "$ref": "#/components/schemas/ComponentTcpUdpCurrentStatus" + } + ] + }, + "Component": { + "description": "A component represents the processing –- reverse proxying, rate limiting, security policy enforcement, header rewrites, etc.\n–- of traffic associated with a logical part (for example, microservice) of an application/API. It also defines the subsequent\nload balancing of traffic to workloads implementing that part of the application/API.\n\nA component can be either a web or a TCP/UDP component –- indicated by the component type. Web components are used to\nconfigure NGINX functionality associated with HTTP/HTTPS protocols and inherit web and common settings from linked Gateways.\nTCP/UDP components are used to configure NGINX functionality associated with TCP/UDP protocols\nand inherit TCP/UDP and common settings from linked Gateways.\n", + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/ComponentDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/ComponentCurrentStatus" + } + } + }, + "ComponentName": { + "type": "string" + }, + "Location": { + "required": [ + "metadata", + "desiredState" + ], + "type": "object", + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/LocationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/LocationState" + } + } + }, + "GetLocationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Location" + } + ] + }, + "ListLocationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Location" + } + } + } + }, + "LocationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/OtherLocation" + }, + { + "$ref": "#/components/schemas/AWSLocation" + }, + { + "$ref": "#/components/schemas/AzureLocation" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "OTHER_LOCATION": "#/components/schemas/OtherLocation", + "AWS_LOCATION": "#/components/schemas/AWSLocation", + "AZURE_LOCATION": "#/components/schemas/AzureLocation" + } + } + }, + "AWSLocation": { + "type": "object", + "required": [ + "vpcID", + "region", + "integrationRef", + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type. Select the environment where you want to create the location. \nTo create a location that’s specific to the AWS cloud environment, select AWS_LOCATION.\n", + "enum": [ + "AWS_LOCATION" + ] + }, + "region": { + "description": "The AWS region.\n", + "type": "string" + }, + "vpcID": { + "type": "string", + "description": "The vpcID of the AWS Virtual Private Cloud (VPC) where new Instances created under this location should reside.\nThe VPC must be in the specified AWS region.\n" + }, + "integrationRef": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "AzureLocation": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "type", + "region", + "resourceGroup", + "subscriptionID", + "integrationRef" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type.", + "enum": [ + "AZURE_LOCATION" + ] + }, + "region": { + "description": "The Azure region.", + "type": "string" + }, + "resourceGroup": { + "type": "string", + "description": "The name of the resourceGroup." + }, + "subscriptionID": { + "type": "string", + "description": "The unique alphanumeric string that identifies the Azure subscription." + }, + "integrationRef": { + "description": "Integration ref.", + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "OtherLocation": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The location type. Select the environment where you want to create the location. \nTo create a location that’s not specific to any cloud environment, select OTHER_LOCATION.\n", + "enum": [ + "OTHER_LOCATION" + ] + } + } + }, + "InstanceTemplate": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/InstanceTemplateState" + }, + "currentStatus": { + "$ref": "#/components/schemas/InstanceTemplateState" + } + } + }, + "GetInstanceTemplateResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/InstanceTemplate" + } + ] + }, + "ListInstanceTemplateResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceTemplate" + } + } + } + }, + "InstanceTemplateState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSInstanceTemplate" + }, + { + "$ref": "#/components/schemas/AzureInstanceTemplate" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_INSTANCE_TEMPLATE": "#/components/schemas/AWSInstanceTemplate", + "AZURE_INSTANCE_TEMPLATE": "#/components/schemas/AzureInstanceTemplate" + } + } + }, + "AWSInstanceTemplate": { + "type": "object", + "required": [ + "type", + "amiID", + "instanceType", + "subnetID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "AWS_INSTANCE_TEMPLATE" + ] + }, + "amiID": { + "type": "string", + "description": "The AWS `amiID` for the image to use when deploying an Instance using the template.\n" + }, + "instanceType": { + "type": "string", + "description": "The machine size.\n" + }, + "subnetID": { + "type": "string", + "description": "The `subnetID` of the AWS subnet where new Instances created using the Instance Template should reside.\n\nThe specified subnet must be in the same AWS Virtual Private Cloud (VPC) as the Instance Template's parent Location resource.\n" + }, + "securityGroupIDs": { + "type": "array", + "description": "The list of AWS securityGroupIDs that you want to apply to new Instances. \n\nThe Security GroupIDs must be available in the same AWS region and Virtual Private Cloud (VPC) as the Instance Template's parent Location resource.\n", + "items": { + "type": "string" + } + }, + "publicKey": { + "type": "string", + "description": "Provide the public key that you want to use to authenticate to the EC2 instance that this template will create. \n" + }, + "associatePublicIPAddress": { + "type": "boolean", + "description": "Specify if a public IP address should be assigned to the instance.\n" + } + } + }, + "AzureInstanceTemplate": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "type", + "instanceType", + "image", + "networkInterface", + "adminUser", + "publicKey" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of Instance Template.", + "enum": [ + "AZURE_INSTANCE_TEMPLATE" + ] + }, + "image": { + "$ref": "#/components/schemas/AzureImage" + }, + "instanceType": { + "type": "string", + "description": "The virtual machine size and type." + }, + "networkInterface": { + "$ref": "#/components/schemas/AzureNetworkInterface" + }, + "adminUser": { + "type": "string", + "description": "The name of the administration account." + }, + "publicKey": { + "type": "string", + "description": "The Public Key string for the adminUser." + } + } + }, + "AzureImage": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureImageID" + }, + { + "$ref": "#/components/schemas/AzureImageReference" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AZURE_IMAGE_ID": "#/components/schemas/AzureImageID", + "AZURE_IMAGE_REFERENCE": "#/components/schemas/AzureImageReference" + } + } + }, + "AzureImageID": { + "type": "object", + "description": "The Azure resource ID for the image to use when deploying an Instance.", + "required": [ + "type", + "imageID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Image.", + "enum": [ + "AZURE_IMAGE_ID" + ] + }, + "imageID": { + "type": "string", + "description": "The resource ID of the Azure image." + } + } + }, + "AzureImageReference": { + "type": "object", + "description": "The parameters that identify which Azure Marketplace image to use for the Instance.", + "required": [ + "type", + "publisher", + "offer", + "sku" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Image.", + "enum": [ + "AZURE_IMAGE_REFERENCE" + ] + }, + "publisher": { + "type": "string", + "description": "The publisher of the Azure Marketplace image." + }, + "offer": { + "type": "string", + "description": "The offer of the Azure Marketplace image." + }, + "sku": { + "type": "string", + "description": "The SKU of the Azure Marketplace image." + }, + "version": { + "type": "string", + "description": "The version of the Azure Marketplace image (default is latest)." + } + } + }, + "AzureNetworkID": { + "type": "object", + "description": "Identifies the existing Azure Network Interface that you want the Instance to use.", + "required": [ + "type", + "nicID" + ], + "properties": { + "type": { + "type": "string", + "description": "The type of the Azure Network Interface.", + "enum": [ + "AZURE_NIC_ID" + ] + }, + "nicID": { + "type": "string", + "description": "The ID of the Azure Network Interface." + } + } + }, + "AppList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App" + } + } + } + }, + "App": { + "type": "object", + "description": "An App is a collection of Components.", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "x-f5-experimental": true, + "type": "object" + }, + "currentStatus": { + "$ref": "#/components/schemas/AppCurrentStatus" + } + } + }, + "AppCurrentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "componentRefs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "Integration": { + "x-f5-experimental": true, + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/IntegrationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/IntegrationState" + } + }, + "example": { + "metadata": { + "name": "my-aws-integration", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY_CREDENTIAL", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY_CREDENTIAL", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "GetIntegrationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Integration" + } + ] + }, + "ListIntegrationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "IntegrationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSIntegration" + } + ], + "discriminator": { + "propertyName": "type" + } + }, + "AWSIntegration": { + "required": [ + "type", + "credential" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AWS_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string" + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSAccessKeyCredential" + } + ], + "discriminator": { + "propertyName": "type" + } + } + } + }, + "AWSAccessKeyCredential": { + "required": [ + "type", + "accessKeyID", + "secretAccessKey" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AWS_ACCESS_KEY_CREDENTIAL" + ] + }, + "accessKeyID": { + "type": "string" + }, + "secretAccessKey": { + "type": "string" + } + } + }, + "PolicyDesiredState": { + "type": "object", + "description": "The defired state of the policy", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/PolicyData", + "example": "{\"policy\": {\"name\": \"/Common/NAPBlockingDefaultPolicy\", \"template\": {\"name\": \"POLICY_TEMPLATE_NGINX_BASE\"}, \"applicationLanguage\": \"utf-8\", \"enforcementMode\": \"blocking\", \"signatures\": [], \"bot-defense\": {\"settings\": {\"isEnabled\": false}}, \"headers\": [{\"name\": \"*\", \"type\": \"wildcard\", \"decodeValueAsBase64\": \"disabled\"}, {\"name\": \"*-bin\", \"type\": \"wildcard\", \"decodeValueAsBase64\": \"required\"},{\"name\": \"Referer\", \"type\": \"explicit\", \"decodeValueAsBase64\": \"disabled\"}, {\"name\": \"Authorization\", \"type\": \"explicit\", \"decodeValueAsBase64\": \"disabled\"}, {\"name\": \"Transfer-Encoding\", \"type\": \"explicit\", \"decodeValueAsBase64\": \"disabled\"}], \"cookies\": [{\"name\": \"*\", \"type\": \"wildcard\", \"decodeValueAsBase64\": \"disabled\"}], \"parameters\": [{\"name\": \"*\", \"type\": \"wildcard\", \"decodeValueAsBase64\": \"disabled\"}]}}" + } + } + }, + "PolicyList": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PolicyStatus" + } + } + } + }, + "PolicyStatus": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/PolicyDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/PolicyCurrentStatus" + } + } + }, + "PolicyCurrentStatus": { + "type": "object", + "description": "Shows the current status of the policy.", + "required": [ + "state", + "data" + ], + "properties": { + "content": { + "type": "object", + "$ref": "#/components/schemas/PolicyData" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + "Policy": { + "type": "object", + "description": "Contains the policy to upload.", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/PolicyDesiredState" + } + } + }, + "PolicyData": { + "type": "object", + "description": "Contains the policy to upload." + }, + "Gateway": { + "type": "object", + "description": "A Gateway represents the initial network entry point of application and/or API traffic into an NGINX instance that is\nin the data path of this traffic. Gateway settings are combined with Component settings that reference the Gateway;\nthe resulting composite config is sent to the NGINX instances that the Gateway references.\n\nA Gateway can be referenced by either web components and/or TCP/UDP components. Web-only settings in the Gateway (for example, web URIs)\napply only to web components. TCP/UDP-only settings in the Gateway (for example, TCP/UDP URIs) apply only to TCP/UDP components.\nWeb and TCP/UDP common settings in the Gateway (for example, global TLS, socket) apply to both web and TCP/UDP components.\n\nExamples:\nGateway with web and TCP/UDP URIs, web-specific settings, common settings. Web URIs and web settings apply to web components.\nCommon settings apply to both component types. TCP/UDP URIs apply only to TCP/UDP components –- presently, there are no other TCP/UDP only settings.\n\nGateway web URIs (for example, https://www.xyz.com) combined with web component URIs (for example, /blog) define web URI config (https://www.xyz.com/blog).\nComponent TCP/UDP URIs define TCP/UDP URI config (for example, tcp+tls://192.168.1.1:200); Gateway TCP/UDP URIs can provide TLS info plus restrict\nwhich TCP/UDP URIs can be in the component. Alternatively, component URIs fully define the URI config if the Gateway has no URIs.\n\nIf only a single URI type is in the Gateway, the URI config for that type is determined by combining the Gateway URIs with\nthe URIs from components of that type; only component URIs are used for the URI config for the other type.\n\nFor HTTPS URIs, global Gateway TLS settings are used when more specific TLS info is not present in the Gateway URIs,\nor for component URIs that have an HTTPS protocol and hostnames with no specific URI or component global TLS settings defined.\n\nFor tcp+tls URIs, Gateway TLS settings are used when TLS info is not defined in a component URI or component global TLS.\nA Gateway URI’s TLS info is used if it encompasses the component URI. For example, tcp+tls://192.168.1.5:100-104 in the Gateway and\ncomponent URI of tcp+tls://192.168.1.5:100. Global Gateway TLS is used if no other TLS settings apply.\n", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/GatewayDesiredState" + }, + "currentStatus": { + "$ref": "#/components/schemas/GatewayCurrentStatus" + } + } + }, + "GatewayCurrentStatus": { + "description": "The current snapshot of the gateway settings that are reflected in the configuration on NGINX instances referenced by this Gateway.\nThese settings should converge to those in Desired State as the new configuration is applied unless there are issues;\nthe State setting gives a summary of how the convergence is proceeding.\n", + "allOf": [ + { + "$ref": "#/components/schemas/GatewayWebState" + }, + { + "$ref": "#/components/schemas/GatewayStateCommon" + }, + { + "type": "object", + "properties": { + "ingress": { + "$ref": "#/components/schemas/GatewayIngress" + }, + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + } + ] + } + }, + "responses": { + "BadRequest": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Unauthorized": { + "description": "User authentication is invalid or missing.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotFound": { + "description": "The specified instance group resource was not found.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Conflict": { + "description": "The request failed due to a conflict with an existing instance group resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotAllowed": { + "description": "The request is not allowed on the specified resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 120322, + "message": "Error deleting the location: the name 'unspecified' is reserved. Specify a different name for the location, then try again." + } + } + } + } + }, + "examples": { + "AWSInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "tags": [ + "prod-1", + "dev-1" + ] + }, + "desiredState": { + "type": "AWS_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/aws-east/instance-templates/small-dev-template" + } + } + } + }, + "AzureInstanceRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "tags": [ + "prod-1", + "dev-1" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/small-dev-template" + } + } + } + }, + "InstanceUpdateRequest": { + "value": { + "metadata": { + "name": "nginx-dp-1", + "displayName": "nginx-dp-1", + "description": "An example NGINX Instance.", + "tags": [ + "prod-1", + "dev-1" + ] + } + } + }, + "AWSInstance": { + "value": { + "metadata": { + "name": "instance-1", + "displayName": "My Instance", + "tags": [ + "prod-1", + "dev-1" + ], + "links": { + "rel": "/infrastructure/locations/unspecified/instances/instance-1" + }, + "createTime": "2019-07-29T09:12:33.001Z", + "updateTime": "2019-07-29T09:12:33.001Z" + }, + "desiredState": { + "type": "AWS_INSTANCE", + "templateRef": { + "ref": "/infrastructure/locations/aws-uswest-2/instance-templates/my-t2-medium" + } + }, + "currentStatus": { + "type": "AWS_INSTANCE", + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "hostname": "instance-1.mycloud.net", + "version": "1.17.3", + "muted": false, + "networkConfig": { + "networkInterfaces": [ + { + "name": "eth0", + "privateDnsName": "ip-172-16-0-71.us-west-2.compute.internal", + "publicDnsName": "ec2-54-212-110-173.us-west-2.compute.amazonaws.com", + "privateIP": "172.16.0.71", + "publicIP": "54.212.110.173", + "subnet": { + "subnetID": "subnet-055d28be58feb0a7d", + "cidrIPv4": "172.16.0.0/24" + } + } + ] + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": 2.8 + }, + "legacyNginxMetadata": { + "build": "nginx-plus-r19", + "built_from_source": false, + "last_seen": "2019-11-12T23:47:52.966Z", + "pid": 2749, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "19-1~bionic" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": null, + "user": "nginx", + "with-cc-opt": "-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.17.3/debian/debuild-base/nginx-plus-1.17.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ] + }, + "start_time": 1573580604000 + }, + "legacySystemMetadata": { + "boot": 1573580280000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "network": { + "default": "lo", + "interfaces": { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + } + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": 1, + "cpus": 4, + "hypervisor": "VMware", + "mhz": 2300, + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": 18.04 + } + } + } + } + }, + "AzureInstance": { + "value": { + "metadata": { + "name": "instance-1", + "createTime": "2020-10-27T22:14:36.994172Z", + "description": "My Azure Instance", + "displayName": "Instance-1", + "tags": [ + "prod-1", + "dev-1" + ], + "kind": "instance", + "links": { + "rel": "/api/v1/infrastructure/locations/azure-westus2/instances/instance-1" + }, + "ref": "/infrastructure/locations/azure-westus2/instances/instance-1", + "uid": "4ed722ec-1bc0-47a1-9772-87718fa9ddb8", + "updateTime": "2020-10-27T22:14:36.994172Z" + }, + "desiredState": { + "nginx": { + "process": { + "group": "test", + "user": "testuser" + } + }, + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/azure-standard-ds1v2" + }, + "type": "AZURE_INSTANCE" + }, + "currentStatus": { + "networkConfig": { + "networkInterfaces": [ + { + "name": "my-nic-1", + "publicDnsName": "myapp.westus2.cloudapp.azure.com", + "privateIP": "10.0.1.4", + "publicIP": "52.229.16.198", + "subnet": { + "subnetID": "subnet-test", + "cidrIPv4": "10.0.1.0/24" + } + } + ] + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": "3.12.5" + }, + "hostname": "instance-1", + "instanceID": "ce266e67-42ec-41a0-b8f4-f4cd0be01828", + "legacyNginxMetadata": { + "build": "nginx-plus-r22", + "built_from_source": true, + "id": 6, + "last_seen": "2020-10-27T22:30:34.376659Z", + "pid": 1138, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "nginx-plus-r22" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": "", + "user": "nginx", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + " 11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + " 11 Sep 2018" + ] + }, + "start_time": 1603836993, + "version": "1.19.0" + }, + "legacySystemMetadata": { + "boot": 1603836911000, + "disk_partitions": [ + { + "device": "/dev/sda1", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda15", + "fstype": "vfat", + "mountpoint": "/boot/efi" + }, + { + "device": "/dev/sdb1", + "fstype": "ext4", + "mountpoint": "/mnt" + } + ], + "id": 5, + "network": { + "default": "eth0", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "10.0.1.4", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "ipv6": { + "address": "fe80::20d:3aff:fec5:3f80", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:0d:3a:c5:3f:80", + "name": "eth0" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "36608K" + }, + "cores": "1", + "cpus": "1", + "hypervisor": "Microsoft", + "mhz": "2095.191", + "model": "Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.5 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "nginx": { + "process": { + "group": "test", + "user": "testuser" + } + }, + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "templateRef": { + "ref": "/infrastructure/locations/azure-westus2/instance-templates/azure-standard-ds1v2" + }, + "type": "AZURE_INSTANCE", + "version": "1.19.0" + } + } + }, + "OtherInstance": { + "value": { + "metadata": { + "name": "test_instance_1", + "displayName": "Test Instance 1", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified/instances/test_instance_1" + }, + "createTime": "2020-05-20T20:02:18.107875Z", + "updateTime": "2020-05-20T20:02:18.107875Z" + }, + "desiredState": { + "type": "OTHER_INSTANCE" + }, + "currentStatus": { + "type": "OTHER_INSTANCE", + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "status": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "agent": { + "credentials": { + "hostname": "instance-1.mycloud.net", + "uuid": "c1088edfd9f35cd38d5b4ce109508fe9" + }, + "version": "999.0.0-1" + }, + "hostname": "test-fab4edf8-data-1.test", + "legacyNginxMetadata": { + "build": "nginx-plus-r21", + "built_from_source": false, + "id": 2, + "last_seen": "2020-05-20T20:40:21.146894Z", + "pid": 2995, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": { + "nginx-plus": "21-1~bionic" + }, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": null, + "user": "nginx", + "with-cc-opt": "'-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-plus-1.17.9/debian/debuild-base/nginx-plus-1.17.9=. -fstack-protector-strong -Wformat -Werror=format-security,-D_FORTIFY_SOURCE=2 -fPIC'", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "11 Sep 2018" + ] + }, + "start_time": 1590004864000 + }, + "legacySystemMetadata": { + "boot": 1590004492000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "id": 1, + "network": { + "default": "lo", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "192.0.10.1", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "mac": "02:42:98:fb:40:48", + "name": "docker0" + }, + { + "ipv4": { + "address": "10.149.41.181", + "netmask": "255.255.240.0", + "prefixlen": 20 + }, + "ipv6": { + "address": "fe80::250:56ff:fe98:e2f1", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:50:56:98:e2:f1", + "name": "ens32" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": "1", + "cpus": "4", + "hypervisor": "VMware", + "mhz": "2300.000", + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "version": "1.17.9" + } + } + }, + "ListInstanceResponse": { + "value": { + "items": [ + { + "currentStatus": { + "agent": { + "version": "3.7.44" + }, + "hostname": "i-563457274582", + "legacyNginxMetadata": { + "build": "nginx-plus-r22", + "built_from_source": false, + "id": 2, + "last_seen": "2020-07-08T17:24:07.869745Z", + "pid": 3104, + "properties": { + "conf-path": "/etc/nginx/nginx.conf", + "error-log-path": "/var/log/nginx/error.log", + "group": "nginx", + "http-client-body-temp-path": "/var/cache/nginx/client_temp", + "http-fastcgi-temp-path": "/var/cache/nginx/fastcgi_temp", + "http-log-path": "/var/log/nginx/access.log", + "http-proxy-temp-path": "/var/cache/nginx/proxy_temp", + "http-scgi-temp-path": "/var/cache/nginx/scgi_temp", + "http-uwsgi-temp-path": "/var/cache/nginx/uwsgi_temp", + "loadable_modules": [ + "ngx_http_f5_metrics_module-debug.so", + "ngx_http_f5_metrics_module.so" + ], + "lock-path": "/var/run/nginx.lock", + "modules-path": "/usr/lib/nginx/modules", + "packages": {}, + "path": { + "bin": "/usr/sbin/nginx", + "conf": "/etc/nginx/nginx.conf" + }, + "pid-path": "/var/run/nginx.pid", + "prefix": "/etc/nginx", + "sbin-path": "/usr/sbin/nginx", + "status_module_enabled": false, + "stub_status_enabled": false, + "stub_status_url": "", + "user": "nginx", + "with-compat": true, + "with-file-aio": true, + "with-http_addition_module": true, + "with-http_auth_jwt_module": true, + "with-http_auth_request_module": true, + "with-http_dav_module": true, + "with-http_f4f_module": true, + "with-http_flv_module": true, + "with-http_gunzip_module": true, + "with-http_gzip_static_module": true, + "with-http_hls_module": true, + "with-http_mp4_module": true, + "with-http_random_index_module": true, + "with-http_realip_module": true, + "with-http_secure_link_module": true, + "with-http_session_log_module": true, + "with-http_slice_module": true, + "with-http_ssl_module": true, + "with-http_stub_status_module": true, + "with-http_sub_module": true, + "with-http_v2_module": true, + "with-ld-opt": "'-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'", + "with-mail": true, + "with-mail_ssl_module": true, + "with-stream": true, + "with-stream_realip_module": true, + "with-stream_ssl_module": true, + "with-stream_ssl_preread_module": true, + "with-threads": true + }, + "running": true, + "ssl": { + "built": [ + "OpenSSL", + "1.1.1", + "", + "11", + "Sep", + "2018" + ], + "run": [ + "OpenSSL", + "1.1.1", + "", + "11", + "Sep", + "2018" + ] + }, + "start_time": 0 + }, + "legacySystemMetadata": { + "boot": 1594225800000, + "disk_partitions": [ + { + "device": "/dev/sda2", + "fstype": "ext4", + "mountpoint": "/" + }, + { + "device": "/dev/sda1", + "fstype": "ext3", + "mountpoint": "/boot" + } + ], + "id": 1, + "network": { + "default": "", + "interfaces": [ + { + "ipv4": { + "address": "127.0.0.1", + "netmask": "255.0.0.0", + "prefixlen": 8 + }, + "ipv6": { + "address": "::1", + "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "prefixlen": 128 + }, + "mac": "00:00:00:00:00:00", + "name": "lo" + }, + { + "ipv4": { + "address": "10.149.41.97", + "netmask": "255.255.240.0", + "prefixlen": 20 + }, + "ipv6": { + "address": "fe80::250:56ff:fe98:b512", + "netmask": "ffff:ffff:ffff:ffff::", + "prefixlen": 64 + }, + "mac": "00:50:56:98:b5:12", + "name": "ens32" + }, + { + "ipv4": { + "address": "192.0.10.1", + "netmask": "255.255.255.0", + "prefixlen": 24 + }, + "mac": "02:42:24:f1:ae:8a", + "name": "docker0" + } + ] + }, + "os-type": "linux", + "processor": { + "architecture": "x86_64", + "cache": { + "L1d": "32K", + "L1i": "32K", + "L2": "1024K", + "L3": "25344K" + }, + "cores": "1", + "cpus": "4", + "hypervisor": "VMware", + "mhz": "2300.000", + "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz", + "virtualization": "full" + }, + "release": { + "codename": "bionic", + "id": "ubuntu", + "name": "Ubuntu", + "version": "18.04.2 LTS (Bionic Beaver)", + "version_id": "18.04" + } + }, + "muted": false, + "state": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "status": { + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + }, + "type": "OTHER_INSTANCE", + "version": "1.19.0" + }, + "desiredState": { + "type": "OTHER_INSTANCE" + }, + "metadata": { + "createTime": "2020-07-08T16:42:07.97301Z", + "displayName": "Test Instance 1", + "kind": "instance", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified/instances/instance-1" + }, + "name": "instance-1", + "ref": "/infrastructure/locations/unspecified/instances/instance-1", + "uid": "ec8d8dac-10b6-4195-943b-1a5d65dd131c", + "updateTime": "2020-07-08T16:42:07.97301Z" + } + } + ] + } + }, + "InstanceGroupRequest": { + "value": { + "metadata": { + "name": "k8s-nginx-deploy", + "displayName": "K8S NGINX+ deployment", + "description": "k8s-nginx-deploy" + }, + "desiredState": {} + } + }, + "GetInstanceGroupResponse": { + "value": { + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + }, + "desiredState": {}, + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + } + } + }, + "ListInstanceGroupsResponse": { + "value": { + "items": [ + { + "currentStatus": { + "instanceRefs": [], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "us-west-2 autoscale group", + "displayName": "aws-autoscale-group", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/amz-us-west-2-as-group" + }, + "name": "amz-us-west-2-as-group", + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "instanceRefs": [ + { + "ref": "/infrastructure/locations/eks-cluster/instances/30dc361a3729" + }, + { + "ref": "/infrastructure/locations/eks-cluster/instances/01a9eead50e5" + } + ], + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": {}, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "K8S NGINX+ deployment", + "displayName": "k8s-nginx-deploy", + "kind": "instance-group", + "links": { + "rel": "/api/v1/infrastructure/instance-groups/k8s-nginx-deploy" + }, + "name": "k8s-nginx-deploy", + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + }, + "IdentityProviderRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "environmentRefs": [ + { + "ref": "/services/environments/dev" + } + ], + "identityProvider": { + "type": "API_KEY" + } + } + } + }, + "IdentityProviderClientListRequest": { + "value": { + "items": [ + { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + ] + } + }, + "IdentityProviderClientRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + }, + "IdentityProviderClientPatchMetadataRequest": { + "value": { + "metadata": { + "name": "resource-name", + "description": "This is a sample description string. It provides information about the resource." + } + } + }, + "IdentityProviderClientPatchDesiredStateRequest": { + "value": { + "desiredState": { + "credential": { + "type": "API_KEY", + "apiKey": "" + } + } + } + }, + "ComponentRequest": { + "value": { + "metadata": { + "name": "resource-name", + "displayName": "My Display Name", + "description": "This is a sample description string. It provides information about the resource.", + "tags": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ] + }, + "desiredState": { + "ingress": { + "uris": { + "/api/golf/": { + "matchMethod": "PREFIX" + } + }, + "gatewayRefs": [ + { + "ref": "/services/environments/dev/gateways/sportsgw" + } + ] + }, + "publishedApiRefs": [ + { + "ref": "/services/environments/dev/apps/sports/published-apis/golf-pub" + } + ], + "backend": { + "workloadGroups": { + "serverGrp1": { + "uris": { + "{{httpWorkloadInstance1}}": {} + } + } + }, + "monitoring": {} + }, + "security": { + "rateLimit": { + "defaultLimit": { + "rate": 1, + "rateMeasure": "SECONDS" + } + } + } + } + } + }, + "OtherLocationRequest": { + "value": { + "metadata": { + "name": "my-other-location", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "OTHER_LOCATION" + } + } + }, + "AWSLocationRequest": { + "value": { + "metadata": { + "name": "my-aws-location", + "description": "AWS Location for us-east-1", + "displayName": "us-east-1-location", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AWS_LOCATION", + "vpcID": "vpc-1234", + "region": "us-east-1", + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + } + } + } + }, + "AzureLocationRequest": { + "value": { + "metadata": { + "name": "my-azure-location", + "description": "Azure Location for West US 2", + "displayName": "westus2-location", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_LOCATION", + "resourceGroup": "myResourceGroup", + "subscriptionID": "mySubscriptionID", + "region": "westus2", + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + } + } + } + }, + "OtherLocationResponse": { + "value": { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + }, + "AWSLocationResponse": { + "value": { + "currentStatus": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + }, + "region": "us-east-1", + "type": "AWS_LOCATION", + "vpcID": "vpc-1234" + }, + "desiredState": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-aws-integration" + }, + "region": "us-east-1", + "type": "AWS_LOCATION", + "vpcID": "vpc-1234" + }, + "metadata": { + "createTime": "2020-05-13T16:57:02.931198Z", + "description": "AWS Location for us-east-1", + "displayName": "us-east-1-location", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-aws-location" + }, + "name": "my-aws-location", + "tags": [ + "dev", + "prod" + ], + "uid": "62f72025-59a1-4c11-8cca-798b5e12efb8", + "updateTime": "2020-05-13T16:57:02.931198Z" + } + } + }, + "AzureLocationResponse": { + "value": { + "currentStatus": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + }, + "type": "AZURE_LOCATION", + "subscriptionID": "mySubscriptionID", + "region": "westus2" + }, + "desiredState": { + "integrationRef": { + "ref": "/api/v1/platform/integrations/my-azure-integration" + }, + "type": "AZURE_LOCATION", + "subscriptionID": "mySubscriptionID", + "region": "westus2" + }, + "metadata": { + "createTime": "2020-05-13T16:57:02.931198Z", + "description": "Azure Location for West US 2", + "displayName": "westus2-location", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-azure-location" + }, + "name": "my-azure-location", + "tags": [ + "dev", + "prod" + ], + "uid": "62f72025-59a1-4c11-8cca-798b5e12efb8", + "updateTime": "2020-05-13T16:57:02.931198Z" + } + } + }, + "ListLocationResponse": { + "value": { + "items": [ + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T09:29:49.464273Z", + "description": "Location for instances where location has not been specified", + "displayName": "Unspecified (default)", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/unspecified" + }, + "name": "unspecified", + "tags": [ + "default" + ], + "uid": "802ef1f8-9105-474a-b9a7-599837efd6b4", + "updateTime": "2020-05-13T09:29:49.464273Z" + } + }, + { + "currentStatus": { + "type": "OTHER_LOCATION" + }, + "desiredState": { + "type": "OTHER_LOCATION" + }, + "metadata": { + "createTime": "2020-05-13T16:58:17.058124Z", + "description": "Other Location for managing instances", + "displayName": "OtherLocation-1", + "kind": "location", + "links": { + "rel": "/api/v1/infrastructure/locations/my-other-location" + }, + "name": "my-other-location", + "tags": [ + "dev", + "prod" + ], + "uid": "97d06b70-0d00-4863-b86d-40ab29efefdc", + "updateTime": "2020-05-13T16:58:17.058124Z" + } + } + ] + } + }, + "AWSRequest": { + "value": { + "metadata": { + "name": "my-instance-template", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AWS_INSTANCE_TEMPLATE", + "amiID": "ami-a0cfeed8", + "instanceType": "t2.large", + "subnetID": "subnet-12345678", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "publicKey": "my-public-key", + "associatePublicIPAddress": true + } + } + }, + "AzureRequestWithMarketplaceImageAndUsingExistingNic": { + "value": { + "metadata": { + "name": "my-azure-template-for-standard-A1", + "description": "Azure Instance Template for Standard A1", + "displayName": "Standard_A1-instance-template", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + } + } + }, + "AzureRequestWithCustomImageAndCreatingNewNicAndPublicIP": { + "value": { + "metadata": { + "name": "my-azure-template-for-standard-DS1_v2", + "description": "Azure Instance Template for Standard DS1v2", + "displayName": "DS1_v2-instance-template", + "tags": [ + "dev", + "prod" + ] + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_ID", + "imageID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myCustomImageID" + }, + "instanceType": "Standard_DS1_v2", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_CONFIG", + "virtualNetwork": "my-virtual-network", + "subnet": "my-subnet", + "securityGroup": "my-network-sg", + "publicIp": true + } + } + } + }, + "AWSResponse": { + "value": { + "currentStatus": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "desiredState": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/location-1/instance-templates/my-instance-template" + }, + "name": "my-instance-template", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + }, + "AzureResponse": { + "value": { + "currentStatus": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + }, + "desiredState": { + "type": "AZURE_INSTANCE_TEMPLATE", + "image": { + "type": "AZURE_IMAGE_REFERENCE", + "publisher": "nginxinc", + "offer": "nginx-plus-v1", + "sku": "nginx-plus-ub1804", + "version": "latest" + }, + "instanceType": "Standard_A1", + "adminUser": "azureuser", + "publicKey": "ssh-rsa my-public-key-string", + "networkInterface": { + "type": "AZURE_NIC_ID", + "nicID": "/subscriptions/mySubscriptionID/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNicID" + } + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "Azure Instance Template for Standard A1", + "displayName": "Standard_A1-instance-template", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/azure-westus2/instance-templates/my-azure-template-for-standard-A1" + }, + "name": "my-azure-template-for-standard-A1", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + }, + "AWSListResponse": { + "value": { + "items": [ + { + "currentStatus": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "desiredState": { + "amiID": "ami-a0cfeed8", + "associatePublicIPAddress": true, + "instanceType": "t2.large", + "publicKey": "my-public-key", + "securityGroupIDs": [ + "sg-12345678", + "sg-98765432" + ], + "subnetID": "subnet-12345678", + "type": "AWS_INSTANCE_TEMPLATE" + }, + "metadata": { + "createTime": "2020-04-17T02:18:44.394232Z", + "description": "AWS Instance Template for T2 large", + "displayName": "T2large-InstanceTemplate", + "kind": "instance-template", + "links": { + "rel": "/api/v1/infrastructure/locations/location-1/instance-templates/my-instance-template" + }, + "name": "my-instance-template", + "uid": "4157d480-cd0e-40a0-8ba8-d0d5ce17c5d6", + "updateTime": "2020-04-17T02:18:44.394232Z" + } + } + ] + } + } + } + } +} diff --git a/static/nginx-controller/api/ctlr-platform-openapi.json b/static/nginx-controller/api/ctlr-platform-openapi.json new file mode 100644 index 000000000..01c7d6bb7 --- /dev/null +++ b/static/nginx-controller/api/ctlr-platform-openapi.json @@ -0,0 +1,7437 @@ +{ + "openapi": "3.0.3", + "info":{ + "title": "NGINX Controller Platform REST API", + "version": "v1", + "description": "Manage the NGINX Controller platform." + }, + "tags": [ + + { + "name": "Authentication Providers", + "description": "Use the Authentication Providers API to create, update, or remove authentication providers." + }, + { + "name": "Login Providers", + "description": "Use the Login Providers API to retrieve a list of the available authentication providers." + }, + { + "name": "Login", + "description": "Use the Login API to retrieve an authentication cookie. Include the session ID that's in the authentication cookie in the request header for all subsequent requests." + }, + { + "name": "Reset Password", + "description": "Use the Reset Password API to manage NGINX Controller password recovery." + }, + { + "name": "Verify Authorization", + "description": "Verifies the current session is authorized to access a list of resources." + }, + { + "name": "Nodes", + "description": "Use the Nodes API to manage NGINX Controller control plane nodes." + }, + { + "name": "Global Settings", + "description": "Use the Global Settings API to manage the system-wide configurations for NGINX Controller and Controller Agent." + }, + { + "name": "Global Features", + "description": "Use the Features API to manage NGINX Controller features." + }, + { + "name": "License", + "description": "Use the License API to manage the license(s) for NGINX Controller." + }, + { + "name": "Integrations", + "description": "Use the Integrations API to manage integrated cloud provider or data collector accounts." + }, + { + "name": "Users", + "description": "Use the Users API to manage NGINX Controller User accounts." + }, + { + "name": "Roles", + "description": "Use the Roles API to manage NGINX Controller User Roles." + }, + { + "name": "Groups", + "description": "Use the Groups API to manage NGINX Controller authentication groups." + } + ], + "servers": [ + { + "description": "NGINX Controller API", + "url": "https://{{CONTROLLER_FQDN}}/api/v1" + }], + "paths": { + "/platform/auth/password-recovery": { + "post": { + "tags": [ + "Password" + ], + "summary": "Request password reset", + "description": "Creates a password recovery code for user with given email and sends an email with reset link. The reset link is valid for an hour.", + "operationId": "requestResetPassword", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetPasswordRequest" + }, + "example": { + "metadata": { + "name": "user@example.com" + } + } + } + } + }, + "responses": { + "204": { + "description": "Successfully created the password recovery code. No content was returned." + } + } + } + }, + "/platform/auth/password-recovery/{code}": { + "put": { + "tags": [ + "Password" + ], + "summary": "Password reset", + "description": "Check if the new password satisfies the policy constraints and update the password for the user associated with the recovery code.", + "operationId": "resetPassword", + "parameters": [ + { + "$ref": "#/components/parameters/code" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetPassword" + }, + "example": { + "desiredState": { + "password": "********" + }, + "metadata": { + "name": "user@example.com" + } + } + } + } + }, + "responses": { + "204": { + "description": "Successfully updated the password for the user. No content was returned." + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/auth/providers": { + "post": { + "tags": [ + "Authentication Providers" + ], + "summary": "Create an Authentication Provider", + "description": "Creates a new authentication provider.\n", + "operationId": "configureAuthProvider", + "requestBody": { + "description": "Contains the configuration for a supported authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldaps://dc1.mydomain.com", + "sslMode": "VERIFY_CA", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "get": { + "tags": [ + "Authentication Providers" + ], + "summary": "List all Authentication Providers", + "description": "Returns a list of all authentication providers.\n", + "operationId": "listAuthProviders", + "responses": { + "200": { + "description": "Successfully returned a list of authentication providers.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListAuthProviders" + }, + "example": { + "items": [ + { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/auth/providers/{providerName}": { + "get": { + "tags": [ + "Authentication Providers" + ], + "summary": "Get an Authentication Provider", + "description": "Returns information about the specified authentication provider.", + "parameters": [ + { + "name": "providerName", + "in": "path", + "description": "The name of the authentication provider.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "operationId": "getProvider", + "responses": { + "200": { + "description": "Successfully returned the requested authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "patch": { + "tags": [ + "Authentication Providers" + ], + "summary": "Update an Authentication Provider", + "description": "Updates the configuration for an existing authentication provider.\n\n> **Note:** You can use PATCH to update one or more specific configurations. Any settings not specified in the request will not be changed.\n", + "parameters": [ + { + "name": "providerName", + "in": "path", + "description": "The name of the authentication provider.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Contains the desired configuration changes for an authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@example.com", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "operationId": "partialUpdateProvider", + "responses": { + "200": { + "description": "Successfully updated the configuration for the authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Authentication Providers" + ], + "summary": "Update an Authentication Provider", + "description": "Updates all of the configurations for an existing authentication provider.\n", + "parameters": [ + { + "name": "providerName", + "in": "path", + "description": "The name of the authentication provider.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Contains the desired configuration for the authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "", + "password": "" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "operationId": "updateProvider", + "responses": { + "200": { + "description": "Successfully updated the configuration for the authentication provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "201": { + "description": "Successfully created the configuration for the provider.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthProvider" + }, + "example": { + "currentStatus": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "********" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "*******" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + }, + "desiredState": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "********" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "*******" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west" + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east" + } + } + ] + } + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "auth-provider", + "name": "ad-dc-1", + "tags": [ + "dev", + "us-1" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "Authentication Providers" + ], + "summary": "Delete an Authentication Provider", + "description": "Deletes the authentication provider.", + "parameters": [ + { + "name": "providerName", + "in": "path", + "description": "The name of the authentication provider.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "operationId": "disable", + "responses": { + "204": { + "description": "Successfully deleted the authentication provider." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/auth/verify": { + "x-f5-experimental": true, + "post": { + "x-f5-experimental": true, + "tags": [ + "Verify Auth Permissions" + ], + "summary": "Request a collection of permitted actions", + "description": "Returns a list of authorized actions based on a list of requested actions and resources.\n", + "operationId": "doVerify", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VerifyList" + }, + "example": { + "items": [ + { + "path": "/services/environments/test1", + "method": "DELETE" + }, + { + "path": "/services/environments/test2", + "method": "PUT" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successfully retrieved a list of authorized actions.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VerifyList" + }, + "example": { + "items": [ + { + "path": "/services/environments/test1", + "method": "DELETE", + "permitted": false + }, + { + "path": "/services/environments/test2", + "method": "PUT", + "permitted": true + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/global": { + "get": { + "tags": [ + "Global Settings" + ], + "summary": "Get the Global Settings", + "operationId": "getGlobalSettings", + "description": "Gets information about the global settings for NGINX Controller.", + "responses": { + "200": { + "description": "Successfully retrieved the global settings for NGINX Controller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Global Settings" + ], + "operationId": "putGlobalSettings", + "description": "Updates the global settings used by NGINX Controller.", + "summary": "Update the Global Settings", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the global settings for NGINX Controller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "patch": { + "tags": [ + "Global Settings" + ], + "operationId": "patchGlobalSettings", + "description": "Updates the global settings for NGINX Controller.", + "summary": "Update part of the Global Settings", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the global settings for NGINX Controller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalSettings" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/global/features": { + "x-f5-experimental": true, + "get": { + "x-f5-experimental": true, + "tags": [ + "Global Features" + ], + "summary": "Get the Global Features", + "operationId": "getGlobalFeatures", + "description": "Gets information about the global features for NGINX Controller.", + "responses": { + "200": { + "description": "Successfully retrieved the global features for NGINX Controller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalFeatures" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/license": { + "get": { + "tags": [ + "License" + ], + "summary": "Get a License", + "description": "Gets information for the active NGINX Controller license.", + "operationId": "getLicense", + "responses": { + "200": { + "description": "Successfully retrieved the active Controller license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseResponse" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "******", + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + }, + "currentStatus": { + "subscription": { + "id": "b6d7c577-b708-44ad-839c-9743f85fcf7c" + }, + "entitlement": { + "features": [ + { + "name": "NGINX Controller Load Balancing", + "limit": 20, + "unitOfMeasure": "WORKLOADS", + "type": "PAID", + "id": "ADC", + "expiry": "1996-02-26T00:00:00.000Z", + "gracePeriodDays": 30 + } + ] + }, + "state": { + "currentInstance": { + "id": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "type": "NGINX Controller", + "status": "INVALID", + "version": "3.3.0", + "telemetryLastReported": "2021-05-10T00:00:00Z", + "features": [ + { + "name": "NGINX Controller Load Balancing", + "used": 5, + "aggregateUsed": 10, + "remaining": 5, + "unitOfMeasure": "WORKLOADS", + "id": "ADC", + "daysUntilExpiry": 20, + "gracePeriodRemainingDays": 30 + } + ], + "configState": { + "selfConfigState": { + "isConfigured": true, + "isConfiguring": false, + "isError": false, + "isDeleting": false + }, + "conditions": [] + } + } + }, + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "License" + ], + "summary": "Upload a License", + "description": "Uploads an NGINX Controller license.\n\nProvide your NGINX Controller license in the JSON request body as a base64-encoded string or as an unencoded customer association token.\n", + "operationId": "putLicense", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PutLicenseRequest" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully uploaded the license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseResponse" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "******", + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + }, + "currentStatus": { + "subscription": { + "id": "b6d7c577-b708-44ad-839c-9743f85fcf7c" + }, + "entitlement": { + "features": [ + { + "name": "NGINX Controller Load Balancing", + "limit": 20, + "unitOfMeasure": "WORKLOADS", + "type": "PAID", + "id": "ADC", + "expiry": "2021-02-26T00:00:00.000Z", + "gracePeriodDays": 30 + } + ] + }, + "state": { + "currentInstance": { + "id": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "type": "NGINX Controller", + "status": "INVALID", + "version": "3.3.0", + "telemetryLastReported": "2021-05-10T00:00:00Z", + "features": [ + { + "name": "NGINX Controller Load Balancing", + "used": 5, + "aggregateUsed": 10, + "remaining": 5, + "unitOfMeasure": "WORKLOADS", + "id": "ADC", + "daysUntilExpiry": 20, + "gracePeriodRemainingDays": 0 + } + ], + "configState": { + "selfConfigState": { + "isConfigured": true, + "isConfiguring": false, + "isError": false, + "isDeleting": false + }, + "conditions": [] + } + } + }, + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + } + } + } + } + }, + "202": { + "description": "The request to upload a license succeeded. The License resource will be created when the upload is complete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseResponse" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "******", + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + }, + "currentStatus": { + "subscription": { + "id": "b6d7c577-b708-44ad-839c-9743f85fcf7c" + }, + "entitlement": { + "features": [ + { + "name": "NGINX Controller Load Balancing", + "limit": 20, + "unitOfMeasure": "WORKLOADS", + "type": "PAID", + "id": "ADC", + "expiry": "2021-02-26T00:00:00.000Z", + "gracePeriodDays": 30 + } + ] + }, + "state": { + "currentInstance": { + "id": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "type": "NGINX Controller", + "status": "INVALID", + "version": "3.3.0", + "telemetryLastReported": "2021-05-10T00:00:00Z", + "features": [ + { + "name": "NGINX Controller Load Balancing", + "used": 5, + "aggregateUsed": 10, + "remaining": 5, + "unitOfMeasure": "WORKLOADS", + "id": "ADC", + "daysUntilExpiry": 20, + "gracePeriodRemainingDays": 0 + } + ], + "configState": { + "selfConfigState": { + "isConfigured": false, + "isConfiguring": true, + "isError": false, + "isDeleting": false + }, + "conditions": [] + } + } + }, + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "License" + ], + "operationId": "deleteLicense", + "summary": "Delete a License", + "description": "Deletes an NGINX Controller License resource.", + "responses": { + "202": { + "description": "Successfully scheduled the request to delete the license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseResponse" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "content": "******", + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + }, + "currentStatus": { + "subscription": { + "id": "b6d7c577-b708-44ad-839c-9743f85fcf7c" + }, + "entitlement": { + "features": [ + { + "name": "NGINX Controller Load Balancing", + "limit": 20, + "unitOfMeasure": "WORKLOADS", + "type": "PAID", + "id": "ADC", + "expiry": "2021-02-26T00:00:00.000Z", + "gracePeriodDays": 30 + } + ] + }, + "state": { + "currentInstance": { + "id": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "type": "NGINX Controller", + "status": "INVALID", + "version": "3.3.0", + "telemetryLastReported": "2021-05-10T00:00:00Z", + "features": [ + { + "name": "NGINX Controller Load Balancing", + "used": 5, + "aggregateUsed": 10, + "remaining": 5, + "unitOfMeasure": "WORKLOADS", + "id": "ADC", + "daysUntilExpiry": 20, + "gracePeriodRemainingDays": 0 + } + ], + "configState": { + "selfConfigState": { + "isConfigured": false, + "isConfiguring": false, + "isError": false, + "isDeleting": true + }, + "conditions": [] + } + } + }, + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 250, + "product": "NGINX Controller Load Balancing", + "serial": 20145, + "type": "PAID", + "version": 1, + "id": "ADC" + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/licenses/nginx-plus-licenses": { + "get": { + "tags": [ + "License" + ], + "summary": "List all NGINX+ Licenses.", + "description": "Returns a list of all NGINX Plus licenses.", + "operationId": "listNginxPlusLicenses", + "responses": { + "200": { + "description": "Successfully retrieved the list of NGINX Plus licenses.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NginxPlusLicensesList" + }, + "example": { + "items": [ + { + "metadata": { + "name": "controller-provided", + "ref": "/platform/licenses/nginx-plus-licenses/controller-provided", + "kind": "license" + }, + "currenStatus": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + }, + "desiredState": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "402": { + "$ref": "#/components/responses/PaymentRequired" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/licenses/nginx-plus-licenses/{licenseName}": { + "get": { + "tags": [ + "License" + ], + "summary": "Get the NGINX Plus certificate and key bundle by name", + "description": "Gets the NGINX Plus certificate and key as a JSON or gzip file.", + "operationId": "getNginxPlusLicense", + "parameters": [ + { + "in": "header", + "name": "Content-Type", + "schema": { + "type": "string", + "example": "application/json" + } + }, + { + "name": "licenseName", + "description": "The name of the license.", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/LicenseName" + } + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the specified NGINX Plus license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NginxPlusLicenseResponse" + }, + "example": { + "metadata": { + "name": "controller-provided", + "ref": "/platform/licenses/nginx-plus-licenses/controller-provided", + "kind": "license" + }, + "currenStatus": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + }, + "desiredState": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + } + } + }, + "application/gzip": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "402": { + "$ref": "#/components/responses/PaymentRequired" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/FileNotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/license-file": { + "post": { + "deprecated": true, + "tags": [ + "License" + ], + "summary": "Upload a License", + "description": "Uploads an NGINX Controller license.\n\nAccepts a single file (encoded as Base64) that may contain one or more product licenses.\n", + "operationId": "uploadLicense", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicenseRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successfully uploaded a license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/License" + }, + "example": { + "metadata": { + "name": "license" + }, + "desiredState": { + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 20, + "product": "NGINX Controller API Management", + "serial": 20145, + "type": "PRODUCTION", + "version": 1, + "id": "APIM" + } + ] + }, + "currentStatus": { + "items": [ + { + "expiry": "2021-05-10T00:00:00Z", + "instanceCount": 20, + "product": "NGINX Controller API Management", + "serial": 20145, + "type": "PRODUCTION", + "version": 1, + "id": "APIM" + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/login": { + "post": { + "tags": [ + "Login" + ], + "summary": "Log in to NGINX Controller", + "description": "Logs in to the NGINX Controller platform and returns the user account's authentication cookie.\n\nThe session ID is returned in an authentication cookie named `session`. You must include this session ID in the request header for all subsequent requests to authenticate to the platform. For example:\n\n`curl -X GET --cookie 'session=' --header 'Content-type: application/json' 'https://192.0.2.10/api/v1/platform/global'`\n\n- The maximum session lifetime is 8 hours. Sessions are purged within 5 minutes of expiring. Once the session lifetime limit is exceeded, you must log in to obtain a fresh session token.\n- Sessions are purged immediately on logout.\n- Sessions are purged immediately if the user is removed.\n", + "operationId": "login", + "requestBody": { + "description": "A JSON object containing the type and the authentication information itself.\n- If type == 'BASIC', then the username and password are required.\n- If type == 'ACTIVE_DIRECTORY', then the authentication provider name, username, and password are required.\n- If type == 'AZURE_ACTIVE_DIRECTORY', then the authentication provider name, and type are required.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Login" + } + } + } + }, + "security": [], + "responses": { + "200": { + "description": "Received request to login with OIDC. Returns the Azure's authorization URL for SSO.\n" + }, + "204": { + "description": "Successfully authenticated.\nThe session ID is returned in an authentication cookie named `session`. You must include this session ID in the request header for all subsequent requests.\n", + "headers": { + "Set-Cookie": { + "schema": { + "type": "string", + "example": "session=.eJwlzjEOwzAIQNG7MGcA22DIZSKbgNI1aaaqd2-kLn96w; HttpOnly; Secure; Path=/" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "409": { + "$ref": "#/components/responses/StatusConflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + }, + "503": { + "$ref": "#/components/responses/ServiceUnavailable" + } + } + }, + "get": { + "tags": [ + "Login" + ], + "summary": "Get Login Session", + "description": "Checks the validity of the current user's session. Returns the user's account info if the session is valid.", + "operationId": "sessionsStatus", + "responses": { + "200": { + "description": "Successfully validated the session ID and returned the associated user account info.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "currentStatus": { + "account": "1", + "authn": "amplify", + "email": "nobody@nodomain.com", + "firstName": "nobody", + "id": 777, + "lastLogin": 1580759750, + "lastName": "here", + "password": "********", + "roles": [ + { + "links": { + "rel": "/api/v1/platform/roles/guest", + "name": "guest" + }, + "ref": "/platform/roles/guest" + } + ], + "groups": [ + { + "links": { + "rel": "/api/v1/platform/auth/groups/guest", + "name": "guest" + }, + "ref": "/platform/groups/guest" + } + ] + }, + "desiredState": { + "email": "nobody@nodomain.com", + "firstName": "nobody", + "lastName": "here", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/guest" + } + ] + }, + "metadata": { + "createTime": "2020-02-03T19:15:24.916809Z", + "kind": "user", + "name": "nobody@nodomain.com", + "updateTime": "2020-02-03T19:55:50.291147Z" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/Internal" + }, + "503": { + "$ref": "#/components/responses/ServiceUnavailable" + } + } + } + }, + "/platform/oidc-handler": { + "get": { + "tags": [ + "OIDC Handler" + ], + "summary": "OIDC redirect URL, that handles Login into controller using OIDC", + "description": "The endpoint that OIDC provider talks to after authenticating the user. It returns the user account's authentication cookie.\n\nThe session ID is returned in an authentication cookie named `session`. You must include this session ID in the request header for all subsequent requests to authenticate to the platform. For example:\n\n`curl -X GET --cookie 'session=' --header 'Content-type: application/json' 'https://192.0.2.10/api/v1/platform/global'`\n\n- The maximum session lifetime is 8 hours.\n- Sessions are purged immediately on logout.\n- Sessions are purged immediately if the user is removed or associated Auth provider is removed.\n Read more about this here https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#successful-response\n", + "operationId": "oidc-handler", + "parameters": [ + { + "in": "query", + "name": "code", + "schema": { + "type": "string" + }, + "description": "The authorization_code that the app requested. The app exchnages teh code to get access token." + }, + { + "in": "query", + "name": "state", + "schema": { + "type": "string" + }, + "description": "State parameter is included if the app added it in the login request to the Identity provider. This helps prevent CSRF attacks." + }, + { + "in": "query", + "name": "error", + "schema": { + "type": "string" + }, + "description": "An error code string sent from the Identity provider when authentication did not go through as expected." + }, + { + "in": "query", + "name": "error_description", + "schema": { + "type": "string" + }, + "description": "A specific error message that describes the root cause of the authentication failure." + } + ], + "security": [], + "responses": { + "302": { + "description": "Successfully authenticated and Sends Redirect back to the home page.\nThe session ID is returned in an authentication cookie named `session`. You must include this session ID in the request header for all subsequent requests.\n", + "headers": { + "Set-Cookie": { + "schema": { + "type": "string", + "example": "session=.eJwlzjEOwzAIQNG7MGcA22DIZSKbgNI1aaaqd2-kLn96w; HttpOnly; Secure; Path=/" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "503": { + "$ref": "#/components/responses/ServiceUnavailable" + } + } + } + }, + "/platform/logout": { + "post": { + "tags": [ + "Logout" + ], + "summary": "Log out of NGINX Controller", + "description": "Logs the user account out of the NGINX Controller platform and expires the authentication cookie.", + "operationId": "logout", + "responses": { + "204": { + "description": "The user was successfully logged out.", + "headers": { + "Set-Cookie": { + "schema": { + "type": "string", + "example": "session=; Expires=Jan 1 1970; Path=/" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/Internal" + }, + "503": { + "$ref": "#/components/responses/ServiceUnavailable" + } + } + } + }, + "/platform/login-providers": { + "get": { + "tags": [ + "Login Providers" + ], + "summary": "List all Active Authentication Providers", + "description": "Returns a list of all [authentication providers](#tag/Authentication-Providers) that are configured and ready for use.\n", + "operationId": "listReadyProviders", + "responses": { + "200": { + "description": "Successfully returned a list of the available authentication providers.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListReadyProviders" + }, + "example": { + "providers": [ + { + "type": "BASIC", + "name": "local" + } + ] + } + } + } + } + } + } + }, + "/platform/nodes": { + "get": { + "tags": [ + "Nodes" + ], + "summary": "List all Nodes", + "operationId": "getNodeList", + "description": "Gets information about the NGINX Controller control-plane nodes.", + "responses": { + "200": { + "description": "Successfully retrieved the NGINX Controller nodes.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodeList" + }, + "example": { + "items": [ + { + "currentStatus": { + "hostname": "host-1", + "ip": "192.0.2.1", + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-1", + "ip": "192.0.2.1" + }, + "metadata": { + "createTime": "2020-09-30T14:14:46Z", + "kind": "node", + "name": "host-1" + } + }, + { + "currentStatus": { + "hostname": "host-2", + "ip": "192.0.2.2", + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "createTime": "2020-09-30T14:19:13.755911Z", + "kind": "node", + "name": "host-2" + } + }, + { + "currentStatus": { + "hostname": "host-3", + "ip": "192.0.2.3", + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 0, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-3", + "ip": "192.0.2.3" + }, + "metadata": { + "createTime": "2020-09-30T14:19:16.155299Z", + "kind": "node", + "name": "host-3" + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "post": { + "tags": [ + "Nodes" + ], + "summary": "Create a Node", + "operationId": "addNode", + "description": "Creates a new NGINX Controller control-plane node.\n\nAfter a node has been created, you must install NGINX Controller on the node to finish adding the node to the cluster.\nIn the JSON response, look for the `install.sh` command and join-key located under `currentStatus.state.conditions.message`.\nThe `type` is `install`. Copy and run this command with the join-key on the new node to finish the setup.\n\nNote: (Optional) If you're adding a deleted node back to the cluster, you must uninstall NGINX Controller from the node before \nrunning the `install.sh` command with the new join-key. To uninstall NGINX Controller, run the uninstall script on the node: \n`/opt/nginx-controller/uninstall.sh`.\n", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Node" + }, + "example": { + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "name": "host-2" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the NGINX Controller node.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Node" + }, + "example": { + "currentStatus": { + "hostname": "host-2", + "ip": "192.0.2.2", + "state": { + "conditions": [ + { + "message": "install.sh --join-key ", + "type": "install" + } + ], + "selfConfigState": { + "configured": 0, + "configuring": 1, + "deleting": 0, + "error": 0, + "isConfigured": false, + "isConfiguring": true, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "createTime": "2020-10-01T10:03:39.228626Z", + "kind": "node", + "name": "host-2" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + }, + "501": { + "$ref": "#/components/responses/NotImplemented" + } + } + } + }, + "/platform/nodes/{nodeName}": { + "get": { + "tags": [ + "Nodes" + ], + "summary": "Get a Node", + "operationId": "getNode", + "description": "Gets information about an NGINX Controller control-plane node by name.", + "parameters": [ + { + "$ref": "#/components/parameters/nodeName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the specified NGINX Controller node.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Node" + }, + "example": { + "currentStatus": { + "hostname": "host-2", + "ip": "192.0.2.2", + "state": { + "conditions": [ + { + "message": "install.sh --join-key ", + "type": "install" + } + ], + "selfConfigState": { + "configured": 0, + "configuring": 1, + "deleting": 0, + "error": 0, + "isConfigured": false, + "isConfiguring": true, + "isDeleting": false, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "createTime": "2020-10-01T10:03:39.228626Z", + "kind": "node", + "name": "host-2" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Nodes" + ], + "summary": "Delete a Node", + "operationId": "deleteNode", + "description": "Deletes an NGINX Controller control-plane node by name.\nThe node's status is `isDeleting` while the workloads\nare being drained from it. Once draining is complete the node is deleted.\n\nNote: (Optional) You must uninstall NGINX Controller from the deleted node before you can add the node back to the cluster. \nTo uninstall NGINX Controller, run the uninstall script on the node: `/opt/nginx-controller/uninstall.sh`.\n", + "parameters": [ + { + "$ref": "#/components/parameters/nodeName" + } + ], + "responses": { + "202": { + "description": "Successfully scheduled the node to be deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Node" + }, + "example": { + "currentStatus": { + "hostname": "host-2", + "ip": "192.0.2.2", + "state": { + "conditions": [], + "selfConfigState": { + "configured": 1, + "configuring": 0, + "deleting": 1, + "error": 0, + "isConfigured": true, + "isConfiguring": false, + "isDeleting": true, + "isError": false, + "total": 1 + } + } + }, + "desiredState": { + "hostname": "host-2", + "ip": "192.0.2.2" + }, + "metadata": { + "createTime": "2020-10-01T10:03:39.228626Z", + "kind": "node", + "name": "host-2" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + }, + "501": { + "$ref": "#/components/responses/NotImplemented" + } + } + } + }, + "/platform/roles": { + "get": { + "tags": [ + "Roles" + ], + "summary": "List Roles", + "description": "Returns an unfiltered list of all Role resources.", + "operationId": "getRoles", + "responses": { + "200": { + "description": "Successfully retrieved a list of all of the Role resources.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleListResponse" + }, + "example": { + "items": [ + { + "currentStatus": { + "permissions": [ + { + "access": "FULL", + "path": "/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "FULL", + "path": "/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T21:29:59.866708Z", + "kind": "role", + "name": "admin" + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "post": { + "tags": [ + "Roles" + ], + "summary": "Create a Role", + "description": "Creates a new Role resource.", + "operationId": "createRole", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "desiredState": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/dev/" + }, + { + "access": "WRITE", + "path": "/services/environments/test/" + } + ] + }, + "metadata": { + "kind": "role", + "name": "role1", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested Role resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "currentStatus": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/dev/" + }, + { + "access": "WRITE", + "path": "/services/environments/test/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/dev/" + }, + { + "access": "WRITE", + "path": "/services/environments/test/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "role", + "name": "role1", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/roles/{roleName}": { + "get": { + "tags": [ + "Roles" + ], + "summary": "Get a Role", + "description": "Returns information about a specific Role resource by its name.\n", + "operationId": "getRoleByName", + "parameters": [ + { + "$ref": "#/components/parameters/roleName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Role resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "currentStatus": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/test/" + }, + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "READ", + "path": "/services/environments/test/" + }, + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "role", + "name": "role1", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Roles" + ], + "summary": "Upsert a Role", + "description": "Creates a new Role resource or updates an existing Role resource.\n", + "operationId": "upsertRole", + "parameters": [ + { + "$ref": "#/components/parameters/roleName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "desiredState": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "metadata": { + "kind": "role", + "name": "role1", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified Role resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "currentStatus": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "role", + "name": "role1", + "updateTime": "2020-02-24T22:53:14.340686Z", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "201": { + "description": "Successfully created the specified Role resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + }, + "example": { + "currentStatus": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "desiredState": { + "permissions": [ + { + "access": "WRITE", + "path": "/services/environments/dev/" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "role", + "name": "role1", + "updateTime": "2020-02-24T22:53:14.340686Z", + "tags": [ + "dev", + "test" + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "Roles" + ], + "summary": "Delete a Role", + "description": "Deletes a specific Role resource.", + "operationId": "deleteRole", + "parameters": [ + { + "$ref": "#/components/parameters/roleName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the role. No content was returned." + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/users": { + "get": { + "tags": [ + "Users" + ], + "summary": "List all Users", + "operationId": "listUsers", + "description": "Returns an unfiltered list of all User resources.", + "responses": { + "200": { + "description": "Successfully retrieved a list of User resources.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserListResponse" + }, + "example": { + "items": [ + { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "John Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "John", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ] + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Create a User", + "operationId": "addUser", + "description": "Creates a new User resource.", + "requestBody": { + "description": "Defines the details to use for the new User resource.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "displayName": "John Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "*******", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ], + "groups": [ + { + "ref": "/platform/groups/guest" + } + ] + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested User resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "John Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ], + "groups": [ + { + "ref": "/platform/groups/guest" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "John", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ], + "groups": [ + { + "links": { + "rel": "/api/v1/platform/auth/groups/guest", + "name": "guest" + }, + "ref": "/platform/groups/guest" + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/platform/users/{userName}": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get a User", + "operationId": "getUser", + "description": "Gets information for an existing User resource.", + "parameters": [ + { + "$ref": "#/components/parameters/userName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested User resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "John Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "John", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "patch": { + "tags": [ + "Users" + ], + "summary": "Update a User", + "operationId": "updateUser", + "description": "Updates an existing User resource.", + "parameters": [ + { + "$ref": "#/components/parameters/userName" + } + ], + "requestBody": { + "description": "Defines the updates to make to the specified User resource.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "displayName": "Jane Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "Jane", + "lastName": "Doe", + "password": "********", + "verifyPassword": "********", + "roles": [ + { + "ref": "/platform/roles/new" + } + ] + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified User resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "Jane Doe", + "description": "NGINX controller user with prod env role" + }, + "desiredState": { + "firstName": "Jane", + "lastName": "Doe", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/new" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "Jane", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/new", + "links": { + "rel": "/api/v1/platform/roles/new", + "name": "new" + } + } + ] + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Users" + ], + "summary": "Delete a User", + "operationId": "deleteUser", + "description": "Deletes a User resource.", + "parameters": [ + { + "$ref": "#/components/parameters/userName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the user. No content was returned." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/platform/integrations": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "List all Integrations", + "description": "Returns an unfiltered list of integration accounts.", + "operationId": "listIntegrations", + "responses": { + "200": { + "description": "Successfully retreived a list of integration accounts.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListIntegrationResponse" + }, + "examples": { + "INTEGRATIONS": { + "$ref": "#/components/examples/ListIntegrationResponse" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Integrations" + ], + "summary": "Create an Integration account", + "description": "Creates a new integration account.", + "operationId": "addIntegration", + "requestBody": { + "description": "Defines the integration account to be added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSRequest" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkRequest" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponse" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkResponse" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "BadReq": { + "$ref": "#/components/examples/BadRequestError" + } + } + } + } + }, + "409": { + "description": "The request failed due to a conflict with an existing integration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "AlreadyExists": { + "$ref": "#/components/examples/AlreadyExistsError" + } + } + } + } + } + } + } + }, + "/platform/integrations/{integrationName}": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "Get an Integration account", + "description": "Gets information about a specific integration account.", + "operationId": "getIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponse" + } + } + } + } + }, + "404": { + "description": "Integration resource not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "NotFound": { + "$ref": "#/components/examples/NotFoundError" + } + } + } + } + } + } + }, + "put": { + "tags": [ + "Integrations" + ], + "summary": "Upsert an Integration account", + "description": "Creates a new integration account or updates an existing integration account.", + "operationId": "upsertIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Integration" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSRequest" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkRequest" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponse" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkResponse" + } + } + } + } + }, + "201": { + "description": "Successfully updated the specified integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIntegrationResponse" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponse" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkResponse" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "BadReq": { + "$ref": "#/components/examples/BadRequestError" + } + } + } + } + } + } + }, + "patch": { + "tags": [ + "Integrations" + ], + "summary": "Update an Integration account", + "description": "Updates an existing integration account.", + "operationId": "updateIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIntegration" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSRequestForPatch" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkRequestForPatch" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully received the request to update the specified integration account.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIntegration" + }, + "examples": { + "AWS": { + "$ref": "#/components/examples/AWSResponseForPatch" + }, + "Splunk": { + "$ref": "#/components/examples/SplunkResponseForPatch" + } + } + } + } + }, + "400": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "BadReq": { + "$ref": "#/components/examples/BadRequestError" + } + } + } + } + }, + "404": { + "description": "Integration resource not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "NotFound": { + "$ref": "#/components/examples/NotFoundError" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Integrations" + ], + "summary": "Delete an Integration account", + "description": "Deletes the specified integration account.", + "operationId": "deleteIntegration", + "parameters": [ + { + "$ref": "#/components/parameters/IntegrationName" + } + ], + "responses": { + "204": { + "description": "Successfully deleted the specified integration account." + }, + "404": { + "description": "Integration not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "NotFound": { + "$ref": "#/components/examples/NotFoundError" + } + } + } + } + } + } + } + }, + "/platform/auth/groups": { + "get": { + "tags": [ + "Groups" + ], + "summary": "List Authentication Groups", + "description": "Returns an unfiltered list of all of the authentication groups.\n\nAn authentication group (or \"AuthN Group\") is a collection of Roles. All AuthN Groups are globally unique. You can assign AuthN Groups to external authentication provider properties (such as AD Groups).\n", + "operationId": "getGroups", + "responses": { + "200": { + "description": "Successfully retrieved a list of all authentication groups.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupListResponse" + }, + "example": { + "items": [ + { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/admin", + "links": { + "rel": "/api/v1/platform/roles/admin", + "name": "admin", + "displayName": "Admin Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T21:29:59.866708Z", + "kind": "group", + "name": "us-group-1" + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "post": { + "tags": [ + "Groups" + ], + "summary": "Add an Authentication Group", + "description": "Creates a new authentication group.", + "operationId": "createGroup", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "kind": "group", + "name": "group-1" + } + } + } + } + }, + "responses": { + "201": { + "description": "Successfully created the requested authentication group.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/user", + "links": { + "rel": "/api/v1/platform/roles/user", + "name": "user", + "displayName": "User Role" + } + }, + { + "ref": "/platform/roles/custom-1", + "links": { + "rel": "/api/v1/platform/roles/custom-1", + "name": "custom-1", + "displayName": "First Custom Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:55:51.729272Z", + "kind": "group", + "name": "group-1" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + }, + "/platform/auth/groups/{groupName}": { + "get": { + "tags": [ + "Groups" + ], + "summary": "Get an Authentication Group", + "description": "Returns information about a specific Authentication Group resource.\n", + "operationId": "getGroupByName", + "parameters": [ + { + "$ref": "#/components/parameters/groupName" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the requested Authentication Group resource.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/user", + "links": { + "rel": "/api/v1/platform/roles/user", + "name": "user", + "displayName": "User Role" + } + }, + { + "ref": "/platform/roles/custom-1", + "links": { + "rel": "/api/v1/platform/roles/custom-1", + "name": "custom-1", + "displayName": "First Custom Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "group", + "name": "group-1" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "put": { + "tags": [ + "Groups" + ], + "summary": "Upsert an Authentication Group", + "description": "Creates a new Authentication Group resource or updates an existing Authentication Group.\n", + "operationId": "upsertGroup", + "parameters": [ + { + "$ref": "#/components/parameters/groupName" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "kind": "group", + "name": "group-1" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated the specified group.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/user", + "links": { + "rel": "/api/v1/platform/roles/user", + "name": "user", + "displayName": "User Role" + } + }, + { + "ref": "/platform/roles/custom-1", + "links": { + "rel": "/api/v1/platform/roles/custom-1", + "name": "custom-1", + "displayName": "First Custom Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "group", + "name": "group-1", + "updateTime": "2020-02-24T22:53:14.340686Z" + } + } + } + } + }, + "201": { + "description": "Successfully created the specified group.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + }, + "example": { + "currentStatus": { + "roles": [ + { + "ref": "/platform/roles/user", + "links": { + "rel": "/api/v1/platform/roles/user", + "name": "user", + "displayName": "User Role" + } + }, + { + "ref": "/platform/roles/custom-1", + "links": { + "rel": "/api/v1/platform/roles/custom-1", + "name": "custom-1", + "displayName": "First Custom Role" + } + } + ] + }, + "desiredState": { + "roles": [ + { + "ref": "/platform/roles/user" + }, + { + "ref": "/platform/roles/custom-1" + } + ] + }, + "metadata": { + "createTime": "2020-02-24T22:38:33.842929Z", + "kind": "group", + "name": "group-1", + "updateTime": "2020-02-24T22:53:14.340686Z" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + }, + "delete": { + "tags": [ + "Groups" + ], + "summary": "Delete an Authentication Group", + "description": "Deletes a specific authentication group.", + "operationId": "deleteGroup", + "parameters": [ + { + "$ref": "#/components/parameters/groupName" + } + ], + "responses": { + "204": { + "description": "Succesfully deleted the authentication group. No content was returned." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/Internal" + } + } + } + } + }, + "components": { + "securitySchemes": { + "cookieAuth": { + "type": "apiKey", + "in": "cookie", + "name": "session" + } + }, + "parameters": { + "nodeName": { + "in": "path", + "name": "nodeName", + "description": "The name of the node.", + "schema": { + "type": "string" + }, + "required": true + }, + "roleName": { + "in": "path", + "name": "roleName", + "schema": { + "type": "string" + }, + "required": true, + "description": "The name of the Role.\n" + }, + "userName": { + "in": "path", + "name": "userName", + "schema": { + "type": "string", + "format": "email" + }, + "required": true, + "description": "The name for the User resource.\n" + }, + "code": { + "in": "path", + "name": "code", + "schema": { + "type": "string", + "minLength": 1 + }, + "required": true, + "description": "The password recovery code.\n" + }, + "IntegrationName": { + "name": "integrationName", + "in": "path", + "description": "The name of the integration account.", + "required": true, + "schema": { + "type": "string" + } + }, + "groupName": { + "in": "path", + "name": "groupName", + "schema": { + "type": "string" + }, + "required": true, + "description": "The name of the group.\n" + } + }, + "responses": { + "BadRequest": { + "description": "Bad input parameter, or possibly a bad URI. Check the input for typos and try again.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 4005, + "message": "Error verifying the authorization: could not decode the request. Check the request body and try again." + } + } + } + }, + "Unauthorized": { + "description": "User authentication is invalid or missing.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 401, + "message": "authentication needed" + } + } + } + }, + "Forbidden": { + "description": "The request failed because of insufficient privileges.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 403, + "message": "unauthorized" + } + } + } + }, + "Internal": { + "description": "The request cannot be processed because of an internal server error.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 4000, + "message": "An internal error occurred while verifying the authorization. If the problem persists, contact the system administrator." + } + } + } + }, + "InternalServerError": { + "description": "The request cannot be processed because of an internal server error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "Conflict": { + "description": "The request failed due to a conflict with an existing Node resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "NotImplemented": { + "description": "The request method is not supported by the server in the current configuration and cannot be handled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + } + }, + "ServiceUnavailable": { + "description": "The request cannot be processed because service is unavailable. Please try resending the request. \n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error retrieving the user information. Try resending the request.", + "code": 2351 + } + } + } + }, + "StatusConflict": { + "description": "Wrong username and/or password.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "message": "Error logging in: incorrect username or password. Check the login credentials, then try resending the request.", + "code": 2379 + } + } + } + }, + "NotFound": { + "description": "The specified authentication group was not found.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 8920, + "message": "Error getting or deleting group: group not found." + } + } + } + }, + "PaymentRequired": { + "description": "The request failed due to missing or expired license.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 4700, + "details": [ + { + "description": "Error getting the NGINX Plus certificate and public key: the license is either expired or no license exists. Upload a valid license file and then try again." + } + ], + "message": "payment required." + } + } + } + }, + "FileNotFound": { + "description": "The requested certificate and key could not be found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "example": { + "code": 4600, + "details": [ + { + "description": "The requested resource was not found or is unavailable." + } + ], + "message": "The requested NGINX Plus license is not found or is unavailable." + } + } + } + } + }, + "schemas": { + "VerifyList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AuthRequest" + }, + "description": "Contains a list of authentication requests.\n" + } + } + }, + "AuthRequest": { + "type": "object", + "required": [ + "path", + "method" + ], + "example": { + "items": [ + { + "path": "/services/environments/test1", + "method": "DELETE", + "permitted": false + }, + { + "path": "/services/environments/test2", + "method": "PUT", + "permitted": true + } + ] + }, + "properties": { + "path": { + "type": "string" + }, + "method": { + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + "TRACE", + "PATCH", + "CONNECT", + "OPTIONS" + ] + }, + "permitted": { + "type": "boolean" + } + } + }, + "ErrorDetail": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "example": "Error doing : . This can lead to . Try to resolve the issue.", + "description": "A detailed error message returned by the server. \n\nThese messages contain the following information, where applicable:\n\n- What happened.\n- Why it happened.\n- What the consequences are (if any).\n- Recommended action to take to resolve the issue.\n" + } + } + }, + "ErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string", + "example": "Error doing .", + "description": "A human-readable message, in English, that describes the error.\n" + }, + "code": { + "type": "integer", + "example": 1234567, + "description": "A numeric error code that can be used to identify errors for support purposes.\n" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ErrorDetail" + } + } + } + }, + "NodeList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Node" + } + } + } + }, + "Node": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "allOf": [ + { + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + } + } + }, + { + "$ref": "#/components/schemas/NodeDef" + } + ] + }, + "desiredState": { + "$ref": "#/components/schemas/NodeDef" + } + } + }, + "NodeDef": { + "type": "object", + "properties": { + "hostname": { + "type": "string", + "format": "hostname", + "description": "The hostname for the NGINX Controller control-plane node. When adding a node, you must provide a hostname or an IP address, or you can specify both. The hostname must be the real hostname, which you can look up by running the `hostname` command." + }, + "ip": { + "type": "string", + "format": "ipv4", + "example": "192.0.2.0", + "description": "The IP address for the NGINX Controller control-plane node. When adding a node, you must provide an IP address or a hostname, or you can specify both." + } + } + }, + "SelfLinks": { + "type": "object", + "description": "The SelfLinks object contains a link from the resource to itself.\nThis object is used only in responses.\n", + "properties": { + "rel": { + "type": "string", + "example": "/api/v1/services/environments/prod", + "description": "`rel` contains the complete path fragment of a URI and can be used\nto construct a query to the object.\n" + } + } + }, + "ResourceMeta": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\*\\\"\\[\\]\\{\\}\\\\\\/%\\?:=&\\~\\^|#<>]+$", + "not": { + "type": "string", + "enum": [ + ".", + ".." + ] + }, + "minLength": 1, + "maxLength": 1024, + "example": "resource-name", + "description": "Resource name is a unique identifier for a resource within the context of a namespace.\nResource names must conform to [RFC 1738 Section 2.2](https://www.ietf.org/rfc/rfc1738.txt) and have a valid syntax for email addresses. The following rules are enforced:\n\n- do not utilize URL encoding;\n- do not include spaces;\n- do not use uppercase characters, for example, 'A-Z'; extended character sets are supported;\n- do not use the following characters: `\"`, `*`, `:`, `;`, `/`, `\\`, `%`, `?`, `hash`, `=`, `&`, `|`, `~`, `^`, `{`, `}`, `[`, `]`, `<`, `>`;\n- cannot start or end with an `@` sign;\n- cannot be only `.` or `..`\n\nFor example: For a collection resource located at\n\n`https://controller.example.com/api/v1/services/apps/shopping_@1`\n\nthe resource name is \"shopping_@1\".\n" + }, + "displayName": { + "type": "string", + "example": "My Display Name", + "description": "`displayName` is a user friendly resource name. It can be used to define \na longer, and less constrained, name for a resource.\n\nDisplay names:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "description": { + "type": "string", + "example": "This is a sample description string. It provides information about the resource.", + "description": "`description` is a free-form text property. You can use it to provide information that helps \nto identify the resource.\n\nDescriptions:\n\n- are optional (defaults to an empty string if no value is provided),\n- do not have to be unique, \n- cannot be assigned by the server.\n" + }, + "kind": { + "type": "string", + "example": "-", + "description": "Kind is a string representation of an API resource's data type.\nIt is assigned by the server and cannot be changed. \n\nWhen creating a `kind`, the server uses hyphens to connect word segments; \nsingleton and collection item resources are not pluralized.\n" + }, + "uid": { + "type": "string", + "format": "uuid", + "example": "d290f1ee-6c54-4b01-90e6-d701748f0851", + "description": "Unique Identifier (UID)\n\nUID is a unique identifier in time and space for a resource. \nWhen you create a resource, the server assigns a UID to the resource.\n\nRefer to [IETF RFC 4122](https://tools.ietf.org/html/rfc4122) for more information.\n" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production_public", + "dev", + "new_app", + "us-west-1", + "emea" + ], + "description": "You can assign `tags` to a resource as a way to help map, scope, \nand organize resources. \n\nThe system uses tag selectors to specify selection criteria that \nmatch resources that have particular tags.\n" + }, + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "The `ref` field contains a reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/SelfLinks" + }, + "createTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T09:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was created.\n\nCreate time is not guaranteed to be set in \"happens-before\" order\nacross separate operations.\n\nIn JSON format, `create_time` type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n\nFor example: 2018-04-01T01:30:15.01Z\n\nCreate Time is assigned by the server and cannot be changed.\n" + }, + "updateTime": { + "type": "string", + "format": "date-time", + "example": "2019-07-29T10:12:33.001Z", + "description": "A timestamp that represents the server time when the resource was last modified.\n\nResources that have never been updated do not have an `update_time` stamp.\n\nThe default value for resources that have never been updated is the local \nlanguage-specific equivalent of \"null\".\n\nIn JSON format, `update_time` type is encoded as a string as described in \n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt).\n" + } + } + }, + "ConfigStateTally": { + "type": "object", + "properties": { + "isConfigured": { + "type": "boolean", + "description": "The configuration operation is complete." + }, + "isConfiguring": { + "type": "boolean", + "description": "The configuration of the resource, or of its child(ren), is in process." + }, + "isError": { + "type": "boolean", + "description": "An error occurred while configuring the resource or its child(ren)." + }, + "isDeleting": { + "type": "boolean", + "description": "A delete operation is in progress for the resource or its child(ren)." + }, + "total": { + "type": "integer", + "description": "The total number of resources to which the configuration operation applies." + }, + "configured": { + "type": "integer", + "description": "The number of resources that have a complete and valid configuration." + }, + "configuring": { + "type": "integer", + "description": "The number of resources that are in the process of being configured." + }, + "error": { + "type": "integer", + "description": "The number of resources that have encountered an error during the configuration process." + }, + "deleting": { + "type": "integer", + "description": "The number of resources that are in the process of being deleted." + } + } + }, + "ConfigCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The condition type." + }, + "message": { + "type": "string", + "description": "A human-readable message that provides additional information about the configuration operation." + } + } + }, + "ConfigState": { + "type": "object", + "description": "A representation of the resource's current configuration state \nthat comprises the status of the resource itself (`selfConfigState`) and any child \nresources (`childrenConfigState`).\n\nThe conditions array provides additional information during configuration changes.\n", + "properties": { + "selfConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "childrenConfigState": { + "$ref": "#/components/schemas/ConfigStateTally" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigCondition" + } + } + } + }, + "RoleListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Role" + }, + "description": "Contains list of Role objects.\n" + } + } + }, + "Role": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/RoleDef" + }, + "currentStatus": { + "$ref": "#/components/schemas/RoleDef" + } + } + }, + "RoleDef": { + "type": "object", + "required": [ + "permissions" + ], + "description": "A Role is a collection of permissions and child Roles. All Roles are globally unique. You can assign Roles to users or to other Roles.\n", + "properties": { + "permissions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/Permission" + } + } + } + }, + "Permission": { + "type": "object", + "required": [ + "access", + "path" + ], + "description": "A Permission is a pair consisting of a path or object and the desired level of access. Permissions govern Users ability to access specific paths or objects within an Environment.\n", + "properties": { + "path": { + "type": "string", + "example": "/services/environments/dev/", + "pattern": "^(\\/[^A-Z\\s\\x00-\\x1f\\x60\\x7f\\;\\\"\\[\\]\\{\\}\\\\\\/]*)+", + "description": "The path represents an area of the platform to which the Role grants access. For example, to allow the Role to access an Environment named \"dev\", you would define the path \"/services/environments/dev\".\n" + }, + "access": { + "type": "string", + "enum": [ + "NONE", + "READ", + "WRITE", + "FULL" + ], + "description": "Access determines the Role's ability to access a path or object. The options are:\n* NONE: Does not have any access to the path or object\n* READ: Has read only access (HTTP GET requests)\n* WRITE: Has read and write access (POST, PUT, PATCH requests) but cannot delete\n* FULL: Has read, write and delete access\n" + } + } + }, + "ListAuthProviders": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AuthProvider" + } + } + } + }, + "AuthProvider": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/AuthProviderDef" + }, + "desiredState": { + "$ref": "#/components/schemas/AuthProviderDef" + } + } + }, + "AuthProviderDef": { + "type": "object", + "properties": { + "provider": { + "oneOf": [ + { + "$ref": "#/components/schemas/ActiveDirectory" + }, + { + "$ref": "#/components/schemas/AzureActiveDirectory" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "ACTIVE_DIRECTORY": "#/components/schemas/ActiveDirectory", + "AZURE_ACTIVE_DIRECTORY": "#/components/schemas/AzureActiveDirectory" + } + }, + "example": { + "provider": { + "type": "ACTIVE_DIRECTORY", + "status": "CONNECTED_BOUND", + "domain": "DC=mydomain,DC=example,DC=com", + "defaultLoginDomain": "mydomain", + "connection": [ + { + "uri": "ldap://dc1.mydomain.com", + "sslMode": "REQUIRE", + "rawCa": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + ], + "groupSearchFilter": "(objectClass=group)", + "groupMemberAttribute": "memberof", + "userFormat": "UPN", + "bindUser": { + "type": "PASSWORD", + "username": "user@mydomain", + "password": "********" + }, + "pollIntervalSec": 3600, + "groupCacheTimeSec": 7200, + "honorStaleGroups": false, + "filteredGroups": [ + "CN=Office_Admins_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=RM_SF,OU=San Francisco,OU=North America,OU=Acme Financial", + "CN=Sales_Warsaw,OU=Warsaw,OU=Europe,OU=Acme Financial", + "CN=ACC_EU,OU=Europe,OU=Acme Financial" + ], + "groupMappings": [ + { + "external": "Engineering-US-West", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-west", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-west", + "name": "eng-west", + "displayName": "West engineering" + } + } + }, + { + "external": "Engineering-US-East", + "caseSensitive": true, + "internal": { + "ref": "/platform/auth/groups/eng-east", + "links": { + "rel": "/api/v1/platform/auth/groups/eng-east", + "name": "eng-east", + "displayName": "East engineering" + } + } + } + ] + } + } + } + } + }, + "ActiveDirectory": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ACTIVE_DIRECTORY" + ] + }, + "status": { + "type": "string", + "description": "This field is read only and will only be reflected in currentStatus and ignored in desiredState.", + "enum": [ + "CONNECTED_BOUND", + "CONNECTED_BIND_FAILED", + "SSL_CA_FAILURE", + "CONNECTION_FAILURE", + "PENDING" + ] + }, + "domain": { + "type": "string", + "description": "The LDAP domain to authenticate against. The domain is unique per each configured Active Directory authentication provider. This field cannot be updated.\n", + "pattern": "^((DC|OU)=[^,=<>]+,)*(DC=[^,,=<>]+)$", + "example": "DC=mydomain,DC=example,DC=com" + }, + "defaultLoginDomain": { + "type": "string", + "description": "The login domain to use when a user authenticates with only a username rather than specifying DOMAIN\\username or username@domain.fqdn. \n", + "example": "mydomain.mycompany.com" + }, + "groupSearchFilter": { + "type": "string", + "description": "The search filter to use when finding users within a root domain.\n", + "example": "(objectClass=group)" + }, + "groupMemberAttribute": { + "type": "string", + "description": "The LDAP attribute to use for specifying membership in an AD Group.\n", + "example": "memberof" + }, + "userFormat": { + "type": "string", + "enum": [ + "USER_DOMAIN", + "UPN" + ], + "description": "The username format. \n\n- UPN = username@domain\n- USER_DOMAIN = domain/user\n", + "example": "UPN" + }, + "connection": { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "$ref": "#/components/schemas/AuthConnection" + } + }, + "groupMappings": { + "type": "array", + "description": "Maps AD Group(s) to NGINX Controller Group(s).\n", + "items": { + "$ref": "#/components/schemas/GroupMapping" + } + }, + "bindUser": { + "$ref": "#/components/schemas/BindUser" + }, + "pollIntervalSec": { + "type": "integer", + "description": "Time, in seconds, between refresh of AD information, including the organization unit list.\n", + "minimum": 300, + "default": 3600 + }, + "groupCacheTimeSec": { + "type": "integer", + "description": "Time, in seconds, for which the list of organizational units is honored before being considered stale. \n> This value should be double the configured `pollIntervalSec`.\n", + "minimum": 600, + "default": 7200 + }, + "honorStaleGroups": { + "type": "boolean", + "default": false, + "description": "Controls whether a stale AD Group list should be honored when authorizing and authenticating users.\n" + }, + "filteredGroups": { + "type": "array", + "description": "List of groups in the AD that satifies the `groupSearchFilter` field. This field is read only. \n", + "items": { + "type": "string" + } + } + }, + "required": [ + "type" + ] + }, + "AzureActiveDirectory": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AZURE_ACTIVE_DIRECTORY" + ] + }, + "status": { + "type": "string", + "description": "This field is read-only, it is reflected in currentStatus and ignored in desiredState.", + "enum": [ + "CONNECTED_BOUND", + "CONNECTION_FAILURE", + "PENDING" + ] + }, + "groupFilter": { + "type": "string", + "description": "The filter attribute is used to filter groups in an Azure AD tenant. See [here](https://docs.microsoft.com/en-us/graph/query-parameters#filter-parameter) for more details.\n", + "example": "groupTypes/any(c:c+eq+'Unified')" + }, + "oidcConfig": { + "$ref": "#/components/schemas/OIDCConfig" + }, + "groupMappings": { + "type": "array", + "description": "Maps Azure AD Group(s) to NGINX Controller Group(s).\n", + "items": { + "$ref": "#/components/schemas/GroupMapping" + } + }, + "pollIntervalSec": { + "type": "integer", + "description": "Time (sec) interval for refreshing Azure AD information, including the groups and group membership information.\n", + "minimum": 300, + "default": 3600 + }, + "groupCacheTimeSec": { + "type": "integer", + "description": "Time (sec) interval for which the group and group membership information are honored before being considered stale.\n> This value should be double the configured `pollIntervalSec`.\n", + "minimum": 600, + "default": 7200 + }, + "honorStaleGroups": { + "type": "boolean", + "default": false, + "description": "Controls whether a stale Azure AD group membership information is honored or not when authorizing and authenticating users.\n" + }, + "filteredGroups": { + "type": "array", + "description": "List of groups in the Azure AD which satisfy the `groupFilter` field. This field is read-only.\n", + "items": { + "type": "string" + } + } + }, + "required": [ + "type" + ] + }, + "AuthConnection": { + "type": "object", + "description": "Connection parameters for an external authentication provider.\n", + "properties": { + "uri": { + "type": "string", + "description": "Connection URI. \n", + "format": "uri", + "pattern": "^ldaps?:\\/\\/([\\w\\-]+\\.)+([\\w\\-]*)(:[0-9]+)?$", + "example": "ldap://dc1.example.com" + }, + "sslMode": { + "type": "string", + "description": "SSL connection parameters.\n- `PLAIN_TEXT`: (Insecure) Unencrypted connection. Does not require SSL certificates.\n- `REQUIRE`: (Default) Require an SSL connection. Unencrypted connections will fail. The server identity is not verified.\n- `VERIFY_CA`: (Most secure) Verify the certificate authority (CA) of the Active Directory connection. The server is verified by checking the certificate chain up to the root certificate stored on the client.\n\n> **Note**: For Production environments, we strongly advise using `VERIFY_CA` for the SSL mode in order to prevent server spoofing.\n", + "enum": [ + "PLAIN_TEXT", + "REQUIRE", + "VERIFY_CA" + ] + }, + "rawCa": { + "type": "string", + "description": "Raw Certificate", + "example": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + } + }, + "required": [ + "uri", + "sslMode" + ] + }, + "GroupMapping": { + "type": "object", + "description": "Authentication provider group to NGINX Controller group mapping.\n", + "properties": { + "caseSensitive": { + "type": "boolean", + "description": "Controls whether or not you want to match the external name exactly or if the match should be case-insensitive.", + "default": false + }, + "external": { + "type": "string", + "description": "The name of the external group.", + "example": "Engineering-US-West" + }, + "internal": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "required": [ + "external", + "internal" + ] + }, + "BindUser": { + "oneOf": [ + { + "$ref": "#/components/schemas/BindUserPassword" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "PASSWORD": "#/components/schemas/BindUserPassword" + } + } + }, + "BindUserPassword": { + "type": "object", + "description": "Credentials used to access data within the AD.\n", + "properties": { + "type": { + "type": "string", + "description": "authentication type.", + "enum": [ + "PASSWORD" + ] + }, + "username": { + "type": "string", + "minLength": 1, + "description": "AD bind username." + }, + "password": { + "type": "string", + "format": "password", + "minLength": 1, + "description": "AD bind user password." + } + }, + "required": [ + "type", + "username", + "password" + ] + }, + "OIDCConfig": { + "type": "object", + "description": "OpenID Connect config for an external identity provider.\n", + "properties": { + "providerURI": { + "type": "string", + "description": "Identity provider URL. It contains the tenant ID for Azure Identity provider. \n", + "format": "uri", + "example": "https://login.microsoftonline.com/d45dfd66-6a3b-40d1-9be0-bf8327d81c56/v2.0" + }, + "clientID": { + "type": "string", + "description": "The Application (client) ID that the identity provider assigns to the NGINX Controller app. For Azure identity providers, you can find it in the portal App registrations.\n", + "example": "781729sd-87b2-4333-9730-338d3a87340b" + }, + "clientSecret": { + "type": "string", + "description": "A secret string that the application uses to prove its identity when requesting a token.\n", + "example": "Ic767hk_8anvoip76v" + }, + "scopes": { + "type": "array", + "description": "OpenID Connect Clients use scope values to specify what access privileges are being requested. See [here](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes) for more information.", + "items": { + "type": "string" + }, + "default": [ + "openid", + "email", + "profile" + ] + }, + "redirectURI": { + "type": "string", + "description": "The redirect URI of NGINX controller, where the identity provider sends authentication responses to. This field is read-only. It is reflected in currentStatus and ignored in desiredState. Set this to be one of the redirect URIs in app registration for NGINX Controller in the identity provider's portal.", + "format": "uri", + "example": "https://54.212.107.157/api/v1/platform/oidc-handler" + } + }, + "required": [ + "providerURI", + "clientID", + "clientSecret" + ] + }, + "NamedLinks": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfLinks" + }, + { + "type": "object", + "description": "Contains information about the object being referred to.\n\nThese are generally details -- like the object name and display name --\nthat are useful to a consumer of the API that performs further\nprocessing. \n\nThis object is only present in responses.\n \n", + "properties": { + "name": { + "type": "string", + "example": "production", + "description": "The name of the linked resource.\n" + }, + "displayName": { + "type": "string", + "example": "Production Environment", + "description": "A user friendly resource name." + } + } + } + ] + }, + "ResourceRef": { + "type": "object", + "required": [ + "ref" + ], + "properties": { + "ref": { + "type": "string", + "example": "/services/environments/prod", + "description": "A reference to another NGINX Controller resource.\n" + }, + "links": { + "$ref": "#/components/schemas/NamedLinks" + } + } + }, + "GlobalSettings": { + "type": "object", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "properties": { + "agentSettings": { + "$ref": "#/components/schemas/AgentSettingsData" + }, + "platformSettings": { + "$ref": "#/components/schemas/PlatformSettingsData" + } + } + }, + "currentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "agentSettings": { + "$ref": "#/components/schemas/AgentSettingsData" + }, + "platformVersion": { + "$ref": "#/components/schemas/PlatformVersionData" + }, + "platformSettings": { + "$ref": "#/components/schemas/PlatformSettingsData" + } + } + } + } + }, + "AgentSettingsData": { + "type": "object", + "description": "Sets the global settings for NGINX Controller Agent.", + "properties": { + "enableNGINXConfigAnalyzer": { + "type": "boolean", + "description": "Disable or enable NGINX configuration file analysis.", + "default": true + }, + "enablePeriodicNGINX-T": { + "type": "boolean", + "description": "Disable or enable periodic NGINX configuration syntax checking with \\\"nginx -t\\\".", + "default": false + }, + "enableAnalyzeSSLCertificates": { + "type": "boolean", + "description": "Disable or enable analyzing SSL certs.", + "default": true + }, + "apiKey": { + "type": "string", + "description": "Access token to retrieve Agent installer." + } + } + }, + "PlatformVersionData": { + "type": "object", + "description": "Returns the version information for NGINX Controller and its sub-components.", + "required": [ + "version", + "buildNumber", + "components" + ], + "properties": { + "version": { + "type": "string", + "description": "The version number." + }, + "buildNumber": { + "type": "string", + "description": "Build number of the artifact used for installation." + }, + "components": { + "type": "array", + "description": "The NGINX Controller sub-components.", + "items": { + "$ref": "#/components/schemas/componentDef" + } + } + }, + "example": { + "version": "3.0.0", + "buildNumber": "2313201", + "components": [ + { + "application": "secrets", + "version": "0.9.1" + }, + { + "application": "platform-mgr", + "version": "0.2.2" + } + ] + } + }, + "componentDef": { + "type": "object", + "required": [ + "application", + "version" + ], + "properties": { + "application": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "example": { + "application": "secrets", + "version": "0.9.1" + } + }, + "PlatformSettingsData": { + "type": "object", + "description": "Sets the platform settings for NGINX Controller.", + "properties": { + "apigwCert": { + "type": "string", + "description": "SSL/TLS certificate (PEM format) for API Gateway.\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n", + "example": "-----BEGIN CERTIFICATE-----\\n MIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\n MiJVGawyxDzBm2UhzNOE0ABHfjAgM6PAYmtMhhQawk6bmttXYhJeqhLSji4LEj5d\\n Z4FmXQ5rWM0RWBs=\\n -----END CERTIFICATE-----" + }, + "apigwKey": { + "type": "string", + "writeOnly": true, + "description": "Private key (PEM format) for API Gateway. Key must match certificate.\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\n", + "example": "-----BEGIN PRIVATE KEY-----\\n MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALSQBtRafNJtTqN0\\n nYiZq6TZUsHjfG2R9PlK6jsvno9O6amN96Al6ZSTTDjhr4VU7/RJ0p/cisiCboCX\\n 4cCq6lFKpIpeZJI=\\n -----END PRIVATE KEY-----" + }, + "FQDN": { + "type": "string", + "description": "Fully qualified domain name for the NGINX Controller server, which users and Controller Agents will use when connecting to NGINX Controller." + }, + "smtpHost": { + "type": "string", + "description": "SMTP host" + }, + "smtpPort": { + "type": "integer", + "description": "SMTP port", + "minimum": 1, + "maximum": 65535 + }, + "smtpAuthentication": { + "type": "boolean", + "description": "Specify if SMTP server requires username and password." + }, + "smtpUseTLS": { + "type": "boolean", + "description": "Specify if SMTP should use TLS." + }, + "smtpFrom": { + "type": "string", + "description": "Specify the email to show in the 'FROM' field." + }, + "smtpUser": { + "type": "string", + "description": "SMTP user (required when smtpAuthentication is enabled)." + }, + "smtpPassword": { + "type": "string", + "description": "SMTP password (required when smtpAuthentication is enabled)." + }, + "dbType": { + "type": "string", + "enum": [ + "external", + "embedded" + ], + "description": "Config database type - embedded or external. Read-only.", + "readOnly": true, + "example": "embedded" + }, + "dbHost": { + "type": "string", + "description": "Config database host (read-only if using an embedded Config database)." + }, + "dbPort": { + "type": "integer", + "description": "Config database port (read-only if using internal Config database).", + "minimum": 1, + "maximum": 65535 + }, + "dbUser": { + "type": "string", + "description": "Config database username (read-only if using internal Config database)." + }, + "dbPassword": { + "type": "string", + "description": "Config database password (read-only if using internal Config database)." + }, + "dbUseTLS": { + "type": "boolean", + "description": "Specify wether the Config database connection uses TLS or not (read-only if using internal Config database)." + }, + "dbCA": { + "type": "string", + "description": "SSL/TLS Certificate Authority certificate (PEM format) for verifying Config database server certificate. Only required if server certificate is signed by a private CA.\nBecause JSON does not support multi-line strings, you must replace line feed and/or carriage return characters with their literal equivalents as two characters - `\\n`, a backslash and letter `n`.\nRead-only if using internal Config database.\n", + "example": "-----BEGIN CERTIFICATE-----\\nMIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\nZ4FmXQ5rWM0RWBs=\\n-----END CERTIFICATE-----" + }, + "dbClientCert": { + "type": "string", + "description": "SSL/TLS client certificate (PEM format) for authenticating when connecting to the Config database.\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\nRead-only if using internal Config database.\n", + "example": "-----BEGIN CERTIFICATE-----\\nMIICpzCCAhACCQDkjx7mP9cuRjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC\\nZ4FmXQ5rWM0RWBs=\\n-----END CERTIFICATE-----" + }, + "dbClientKey": { + "type": "string", + "description": "Private key (PEM format) for Config database connection. Key must match certificate.\nBecause JSON does not support multi-line strings, you must replace binary line feeds with ASCII line feeds (`\\n`).\nRead-only if using internal Config database.\n", + "example": "-----BEGIN PRIVATE KEY-----\\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALSQBtRafNJtTqN0\\nnYiZq6TZUsHjfG2R9PlK6jsvno9O6amN96Al6ZSTTDjhr4VU7/RJ0p/cisiCboCX\\n4cCq6lFKpIpeZJI=\\n-----END PRIVATE KEY-----" + }, + "tsdbVolumeType": { + "type": "string", + "description": "Time Series database volume type.", + "enum": [ + "local", + "nfs", + "aws" + ], + "readOnly": true + }, + "tsdbNFSHost": { + "type": "string", + "description": "Time Series database NFS host.", + "readOnly": true + }, + "tsdbNFSPath": { + "type": "string", + "description": "Time Series database NFS path.", + "readOnly": true + }, + "tsdbAWSVolumeID": { + "type": "string", + "description": "Time Series database AWS Volume ID.", + "readOnly": true + }, + "clusterFloatingIP": { + "type": "string", + "pattern": "^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^$", + "description": "Floating IPv4 address used to communicate with Controller in multinode/cluster mode.\nThis setting is only valid for local (non-cloud) installations. Set empty value to disable floating IP.\n" + }, + "clusterLoadBalancer": { + "type": "string", + "description": "Hostname or IP of the external cluster load balancer. Read-only.", + "readOnly": true + } + } + }, + "UserDef": { + "type": "object", + "required": [ + "firstName", + "lastName", + "email", + "password" + ], + "properties": { + "account": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": 1, + "deprecated": true, + "description": "The account number of the tentant." + }, + "id": { + "type": "integer", + "example": 123, + "description": "Account ID" + }, + "firstName": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "John", + "description": "Given name." + }, + "lastName": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "Doe", + "description": "Surname." + }, + "lastLogin": { + "type": "integer", + "example": 1570132969, + "description": "Unix time (seconds since Epoch) of last login." + }, + "email": { + "type": "string", + "example": "john.doe@example.com", + "description": "An email address that serves as the account's username. This must match the resource's metadata.name property.", + "format": "email" + }, + "authn": { + "type": "string", + "enum": [ + "amplify" + ] + }, + "password": { + "type": "string", + "format": "password", + "minLength": 8, + "maxLength": 64, + "description": "Passwords must meet the following requirements:\n\n - length must be between 8 and 64 characters\n - must contain at least 1 letter\n - must contain at least 1 number\n - must be different from the old password\n\n Dictionary words, mangled dictionary words, or systematic passwords like '1234567a' are not allowed.\n" + }, + "apiKey": { + "type": "string", + "example": "761ab961448865d86ef71c67fd74432b", + "deprecated": true, + "description": "User api key." + }, + "isEnabled": { + "type": "boolean", + "description": "Indicates if the account is enabled.", + "default": false + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + }, + "groups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + }, + "User": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/UserDef" + }, + "currentStatus": { + "$ref": "#/components/schemas/UserDef" + } + } + }, + "UpdateUser": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/UpdateUserDef" + }, + "currentStatus": { + "$ref": "#/components/schemas/UserDef" + } + }, + "example": { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "Jane Doe", + "description": "NGINX Controller user with a production environment role." + }, + "desiredState": { + "firstName": "Jane", + "lastName": "Doe", + "password": "********", + "verifyPassword": "********", + "roles": [ + { + "ref": "/platform/roles/new" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "Jane", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ] + } + } + }, + "UpdateUserDef": { + "type": "object", + "properties": { + "firstName": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "Jane", + "description": "Given name." + }, + "lastName": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "Doe", + "description": "Surname." + }, + "password": { + "type": "string", + "format": "password", + "minLength": 8, + "maxLength": 64, + "description": "The user's password must meet the following requirements:\n\n - Length must be between 8 and 64 characters\n - Must contain at least 1 letter\n - Must contain at least 1 number\n - Must be different from the old password\n - Dictionary words, mangled dictionary words, or systematic passwords like '1234567a' are not allowed\n \n" + }, + "verifyPassword": { + "type": "string", + "format": "password", + "description": "The user's current password. Users must verify their current password to make updates to their user profiles. The current password does not need to be verified when an admin user updates other users' profiles." + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + }, + "example": { + "firstName": "Jane", + "lastName": "Doe", + "password": "********", + "verifyPassword": "********", + "roles": [ + { + "ref": "/platform/roles/new" + } + ] + } + }, + "UserListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + }, + "description": "List of User resources." + } + }, + "example": { + "items": [ + { + "metadata": { + "name": "john.doe@example.com", + "kind": "user", + "createTime": "2019-07-29T09:12:33.001Z", + "displayName": "John Doe", + "description": "NGINX Controller user with production environment role" + }, + "desiredState": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@example.com", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod" + } + ] + }, + "currentStatus": { + "account": "1", + "id": 123, + "firstName": "John", + "lastName": "Doe", + "lastLogin": 1570132969, + "email": "john.doe@example.com", + "authn": "amplify", + "password": "********", + "roles": [ + { + "ref": "/platform/roles/prod", + "links": { + "rel": "/api/v1/platform/roles/prod", + "name": "prod" + } + } + ] + } + } + ] + } + }, + "GlobalFeatures": { + "type": "object", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "properties": { + "featureFlags": { + "type": "array", + "description": "Flags to describe or extend NGINX Controller behavior (optional).", + "items": { + "$ref": "#/components/schemas/FeatureFlagsDef" + } + } + } + }, + "currentStatus": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/ConfigState" + }, + "featureFlags": { + "type": "array", + "description": "Flags to describe or extend NGINX Controller behavior (optional).", + "items": { + "$ref": "#/components/schemas/FeatureFlagsDef" + } + } + } + } + } + }, + "FeatureFlagsDef": { + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "example": { + "name": "reserved", + "value": "true" + } + }, + "ResetPasswordRequest": { + "type": "object", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + } + } + }, + "ResetPassword": { + "type": "object", + "required": [ + "desiredState", + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "required": [ + "password" + ], + "properties": { + "password": { + "type": "string", + "format": "password", + "example": "TestImpl45!", + "minLength": 8, + "maxLength": 64, + "description": "The user's password must meet the following requirements:\n - Length must be between 8 and 64 characters\n - Must contain at least 1 letter\n - Must contain at least 1 number\n - Must be different from the old password\n - Dictionary words, mangled dictionary words, or systematic passwords like '1234567a' are not allowed.\n" + } + } + } + } + }, + "LicenseRequest": { + "type": "object", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "string", + "format": "password", + "description": "License file contents, encoded as Base64" + } + } + }, + "PutLicenseRequest": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "string", + "format": "password", + "description": "The customer association token or NGINX Controller license, which can be downloaded from your [MyF5](account.f5.com/myf5) account. The license must be formatted as a base64-encoded string, while the association token is unencoded." + } + } + } + } + }, + "License": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseData" + } + } + } + }, + "currentStatus": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseData" + } + } + } + } + } + }, + "LicenseResponse": { + "type": "object", + "required": [ + "metadata", + "desiredState", + "currentStatus" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "type": "object", + "properties": { + "content": { + "type": "string", + "format": "password", + "description": "Redacted license information." + }, + "items": { + "type": "array", + "deprecated": true, + "items": { + "$ref": "#/components/schemas/LicenseData" + } + } + } + }, + "currentStatus": { + "type": "object", + "properties": { + "subscription": { + "$ref": "#/components/schemas/Subscription" + }, + "entitlement": { + "$ref": "#/components/schemas/Entitlement" + }, + "state": { + "type": "object", + "required": [ + "currentInstance" + ], + "properties": { + "currentInstance": { + "$ref": "#/components/schemas/CurrentInstance" + } + } + }, + "items": { + "type": "array", + "deprecated": true, + "items": { + "$ref": "#/components/schemas/LicenseData" + } + } + } + } + } + }, + "LicenseData": { + "type": "object", + "required": [ + "product", + "expiry", + "instanceCount", + "serial", + "version", + "type", + "id" + ], + "description": "Defines the features of a given license", + "properties": { + "product": { + "type": "string", + "description": "The name of the product the license enables.", + "example": "NGINX Controller Monitoring" + }, + "expiry": { + "type": "string", + "format": "date-time", + "description": "The date on which the license expires. Represented in Coordinated Universal Time (UTC), specifically using the ISO 8601 standard.", + "example": "1996-02-26T00:00:00.000Z" + }, + "instanceCount": { + "type": "integer", + "description": "The number of instances that are allowed by the license.", + "example": 20 + }, + "serial": { + "type": "integer", + "description": "A unique identifier for the license.", + "example": 20145 + }, + "version": { + "type": "integer", + "description": "The product version number.", + "example": 1 + }, + "type": { + "type": "string", + "description": "The license type. Lowercase values are deprecated.", + "enum": [ + "production", + "beta", + "internal", + "partner", + "trial", + "PRODUCTION", + "BETA", + "INTERNAL", + "PARTNER", + "TRIAL", + "PAID", + "EVAL" + ] + }, + "id": { + "type": "string", + "description": "Unique identifier for a product.", + "enum": [ + "UNKNOWN", + "ADC", + "APIM", + "ANALYTICS" + ] + } + } + }, + "Subscription": { + "type": "object", + "required": [ + "id" + ], + "description": "Defines the features of a subscription.", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b6d7c577-b708-44ad-839c-9743f85fcf7c", + "description": "Subscription ID." + } + } + }, + "Entitlement": { + "type": "object", + "required": [ + "features" + ], + "description": "Defines the elements of an entitlement.", + "properties": { + "features": { + "type": "array", + "description": "Product features.", + "items": { + "$ref": "#/components/schemas/Feature" + } + } + } + }, + "Feature": { + "type": "object", + "required": [ + "name", + "unitOfMeasure", + "id", + "type" + ], + "description": "Defines a product feature, consumption metric, and metric usage limit.", + "properties": { + "name": { + "type": "string", + "description": "Name of the feature.", + "example": "NGINX Controller Load Balancing" + }, + "limit": { + "type": "integer", + "description": "Maximum limit for the consumption metric.", + "example": 1, + "minimum": 0 + }, + "unlimited": { + "type": "boolean", + "description": "Indicates whether there is a limit for the consumption metric or not.", + "example": true + }, + "unitOfMeasure": { + "$ref": "#/components/schemas/UnitOfMeasure" + }, + "type": { + "type": "string", + "description": "The license type.", + "example": "PAID", + "enum": [ + "PRODUCTION", + "BETA", + "INTERNAL", + "PARTNER", + "TRIAL", + "PAID", + "EVAL" + ] + }, + "id": { + "$ref": "#/components/schemas/FeatureID" + }, + "expiry": { + "type": "string", + "format": "date-time", + "description": "The date on which the license expires. Represented in Coordinated Universal Time (UTC), specifically using the ISO 8601 standard.", + "example": "1996-02-26T00:00:00.000Z" + }, + "gracePeriodDays": { + "type": "integer", + "description": "Number of grace period days after the license expires.", + "example": 30, + "minimum": 0 + } + } + }, + "CurrentInstance": { + "type": "object", + "required": [ + "type", + "version", + "status", + "features", + "configState" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "8ce9b80a-f7fc-48fd-ac28-8d5f3fe898d6", + "description": "Unique identifier for the current instance." + }, + "telemetryLastReported": { + "type": "string", + "format": "date-time", + "description": "Date and time when telemetry data was last reported from the current instance. Represented in Coordinated Universal Time (UTC), specifically using the ISO 8601 standard.", + "example": "1996-02-26T00:00:00.000Z" + }, + "type": { + "type": "string", + "example": "NGINX Controller", + "description": "Product type." + }, + "status": { + "type": "string", + "description": "Status of the current instance with respect to the license.\n\n- `NONE`: The current instance is not yet licensed.\n- `INVALID`: The current instance has at least one entitlement in non-functional license status.\n- `ENFORCED`: The current instance has at least one entitlement in enforced license status and no entitlements in non-functional status.\n- `GRACE`: The current instance has at least one entitlement in grace period license status and no entitlements in enforced or non-functional status.\n- `VALID`: The current instance has valid entitlement(s) that have no adverse license statuses.\n- `CORRUPTED`: The license for the current instance is corrupted. Upload the license file again to rectify the status.\n", + "enum": [ + "NONE", + "INVALID", + "ENFORCED", + "GRACE", + "VALID", + "CORRUPTED" + ] + }, + "version": { + "type": "string", + "example": "3.3.0", + "description": "Product version." + }, + "configState": { + "$ref": "#/components/schemas/ConfigState" + }, + "features": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeatureStatus" + }, + "description": "List of the available features and their current usage." + } + } + }, + "FeatureStatus": { + "type": "object", + "required": [ + "name", + "unitOfMeasure", + "id" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the product feature.", + "example": "NGINX Controller Load Balancing" + }, + "used": { + "type": "number", + "description": "Amount of the feature used by the current NGINX Controller instance.", + "example": 1, + "minimum": 0 + }, + "aggregateUsed": { + "type": "number", + "description": "Amount of the feature used by all NGINX Controller instances in the bucket.", + "example": 1, + "minimum": 0 + }, + "remaining": { + "type": "number", + "description": "Amount of the feature remaining.", + "example": 1, + "minimum": 0 + }, + "unitOfMeasure": { + "$ref": "#/components/schemas/UnitOfMeasure" + }, + "id": { + "$ref": "#/components/schemas/FeatureID" + }, + "daysUntilExpiry": { + "type": "integer", + "description": "Defines when the current entitlement expires.", + "example": 20, + "minimum": 0 + }, + "gracePeriodRemainingDays": { + "type": "integer", + "description": "Defines the remaining grace period days after the license expires.", + "minimum": 0 + } + } + }, + "UnitOfMeasure": { + "type": "string", + "enum": [ + "INSTANCES", + "WORKLOADS", + "DATA_PER_HOUR_IN_GB", + "SUCCESSFUL_API_CALLS_IN_MILLIONS", + "SUCCESSFUL_API_CALLS" + ], + "description": "Unit of measure used for computing consumption.", + "example": "WORKLOADS" + }, + "FeatureID": { + "type": "string", + "enum": [ + "UNKNOWN", + "ADC", + "APIM", + "ANALYTICS" + ], + "example": "ADC", + "description": "Unique identifier for a product feature." + }, + "LicenseName": { + "type": "string", + "description": "Name of the License resource.", + "example": "controller-provided" + }, + "NginxPlusLicensesList": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NginxPlusLicenseResponse" + } + } + } + }, + "NginxPlusLicenseResponse": { + "type": "object", + "required": [ + "metadata", + "currentStatus", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "currentStatus": { + "$ref": "#/components/schemas/NginxPlusKeys" + }, + "desiredState": { + "$ref": "#/components/schemas/NginxPlusKeys" + } + }, + "example": { + "metadata": { + "name": "controller-provided", + "ref": "/platform/licenses/nginx-plus-licenses/controller-provided", + "kind": "license" + }, + "currenStatus": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + }, + "desiredState": { + "certKey": "a valid certificate key for NGINX Plus", + "privateKey": "a valid private key for NGINX Plus" + } + } + }, + "NginxPlusKeys": { + "type": "object", + "required": [ + "certKey", + "privateKey" + ], + "properties": { + "certKey": { + "type": "string", + "description": "Contents of the certificate file that is required to install NGINX Plus.\n" + }, + "privateKey": { + "type": "string", + "description": "Contents of the key file that is required to install NGINX Plus.\n" + } + } + }, + "Login": { + "type": "object", + "properties": { + "credentials": { + "oneOf": [ + { + "$ref": "#/components/schemas/BasicAuth" + }, + { + "$ref": "#/components/schemas/ActiveDirectoryAuth" + }, + { + "$ref": "#/components/schemas/AzureActiveDirectoryAuth" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "BASIC": "#/components/schemas/BasicAuth", + "ACTIVE_DIRECTORY": "#/components/schemas/ActiveDirectoryAuth", + "AZURE_ACTIVE_DIRECTORY": "#/components/schemas/AzureActiveDirectoryAuth" + } + }, + "example": { + "type": "BASIC", + "username": "guest@example.com", + "password": "********" + } + } + } + }, + "AzureActiveDirectoryAuth": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AZURE_ACTIVE_DIRECTORY" + ] + }, + "providerName": { + "type": "string", + "description": "The Azure active directory provider name configured within NGINX Controller.\n" + } + }, + "required": [ + "type", + "providerName" + ] + }, + "ActiveDirectoryAuth": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "ACTIVE_DIRECTORY" + ] + }, + "username": { + "type": "string", + "description": "The username for the NGINX Controller User account.\n" + }, + "password": { + "type": "string", + "description": "The password for the NGINX Controller User account.\n" + }, + "providerName": { + "type": "string", + "description": "The active directory provider name configured within NGINX Controller.\n" + } + }, + "required": [ + "type", + "username", + "password", + "providerName" + ] + }, + "BasicAuth": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "BASIC" + ] + }, + "username": { + "type": "string", + "description": "The username for the NGINX Controller User account.\n" + }, + "password": { + "type": "string", + "description": "The password for the NGINX Controller User account.\n" + } + }, + "required": [ + "type", + "username", + "password" + ] + }, + "ListReadyProviders": { + "type": "object", + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimpleAuthProvider" + } + } + } + }, + "SimpleAuthProvider": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "BASIC", + "ACTIVE_DIRECTORY", + "AZURE_ACTIVE_DIRECTORY" + ] + } + } + }, + "Integration": { + "type": "object", + "description": "The Integration resource defines the account credentials and endpoint needed for NGINX Controller to connect to external services.\n", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/IntegrationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/IntegrationState" + } + } + }, + "GetIntegrationResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Integration" + } + ] + }, + "ListIntegrationResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Integration" + } + } + } + }, + "UpdateIntegration": { + "type": "object", + "required": [ + "metadata" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/UpdateIntegrationState" + }, + "currentStatus": { + "$ref": "#/components/schemas/UpdateIntegrationState" + } + } + }, + "UpdateIntegrationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSIntegrationForUpdate" + }, + { + "$ref": "#/components/schemas/AzureIntegrationForUpdate" + }, + { + "$ref": "#/components/schemas/GenericIntegrationForUpdate" + }, + { + "$ref": "#/components/schemas/VSphereIntegrationForUpdate" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_INTEGRATION": "#/components/schemas/AWSIntegrationForUpdate", + "AZURE_INTEGRATION": "#/components/schemas/AzureIntegrationForUpdate", + "GENERIC_INTEGRATION": "#/components/schemas/GenericIntegrationForUpdate", + "VSPHERE_INTEGRATION": "#/components/schemas/VSphereIntegrationForUpdate" + } + } + }, + "AWSIntegrationForUpdate": { + "description": "The AWS integration stores the AWS access key for programmatic access to the AWS cloud API.\n", + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The AWS_INTEGRATION is an integration for connecting to Amazon Web Services (AWS).", + "enum": [ + "AWS_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string", + "description": "The URI of the AWS cloud service endpoint." + }, + "credential": { + "description": "Account credentials for AWS cloud API.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/AWSAccessKeyCredential" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_ACCESS_KEY": "#/components/schemas/AWSAccessKeyCredential" + } + } + } + } + }, + "AzureIntegrationForUpdate": { + "description": "The Azure integration stores the Azure credentials for programmatic access to the Azure cloud API.\n", + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The AZURE_INTEGRATION is an integration for connecting to Microsoft Azure.", + "enum": [ + "AZURE_INTEGRATION" + ] + }, + "credential": { + "description": "Account credentials for Azure cloud API.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureServicePrincipal" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AZURE_SERVICE_PRINCIPAL": "#/components/schemas/AzureServicePrincipal" + } + } + } + } + }, + "VSphereIntegrationForUpdate": { + "type": "object", + "description": "The VSphere integration stores the credentials for programmatic access to the VSphere cloud API.\n", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "description": "The VSPHERE_INTEGRATION is an Integration for connecting to the VSphere datacenter.\n", + "enum": [ + "VSPHERE_INTEGRATION" + ] + }, + "hostname": { + "type": "string", + "description": "VSphere instance hostname ( FQDN or IP ), Connection to it from the controller is through https, the VSphere server certificate is not verified." + }, + "rawCa": { + "type": "string", + "description": "Raw CA Certificate used to verify the vSphere server certificate", + "example": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserPassCredential" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "USER_PASS": "#/components/schemas/UserPassCredential" + } + } + } + } + }, + "GenericIntegrationForUpdate": { + "required": [ + "type" + ], + "type": "object", + "description": "A Generic integration stores the credentials and URI endpoint to connect to external services\nthat require a username and password or an API token for authentication, or accept an unauthenticated connection.\n", + "properties": { + "type": { + "type": "string", + "description": "The GENERIC_INTEGRATION is an integration for connecting to external services that require a\nusername and password or an API key, or accept an unauthenticated connection.\n", + "enum": [ + "GENERIC_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string", + "description": "The URI of the service endpoint." + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserPassCredential" + }, + { + "$ref": "#/components/schemas/ApiKeyCredential" + }, + { + "$ref": "#/components/schemas/Unauthenticated" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "USER_PASS": "#/components/schemas/UserPassCredential", + "API_KEY": "#/components/schemas/ApiKeyCredential", + "UNAUTHENTICATED": "#/components/schemas/Unauthenticated" + } + } + } + } + }, + "IntegrationState": { + "oneOf": [ + { + "$ref": "#/components/schemas/AWSIntegration" + }, + { + "$ref": "#/components/schemas/AzureIntegration" + }, + { + "$ref": "#/components/schemas/GenericIntegration" + }, + { + "$ref": "#/components/schemas/VSphereIntegration" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_INTEGRATION": "#/components/schemas/AWSIntegration", + "AZURE_INTEGRATION": "#/components/schemas/AzureIntegration", + "GENERIC_INTEGRATION": "#/components/schemas/GenericIntegration", + "VSPHERE_INTEGRATION": "#/components/schemas/VSphereIntegration" + } + } + }, + "AzureIntegration": { + "description": "The Azure integration stores the Azure credentials for programmatic access to the Azure cloud API.\n", + "required": [ + "type", + "credential" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The AZURE_INTEGRATION is an integration for connecting to Microsoft Azure.", + "enum": [ + "AZURE_INTEGRATION" + ] + }, + "credential": { + "description": "Account credentials for Azure cloud API.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureServicePrincipal" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AZURE_SERVICE_PRINCIPAL": "#/components/schemas/AzureServicePrincipal" + } + } + } + } + }, + "AWSIntegration": { + "description": "The AWS integration stores the AWS access key for programmatic access to the AWS cloud API.\n", + "required": [ + "type", + "credential" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The AWS_INTEGRATION is an integration for connecting to Amazon Web Services (AWS).", + "enum": [ + "AWS_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string", + "description": "The URI of the AWS cloud service endpoint." + }, + "credential": { + "description": "Account credentials for AWS cloud API.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/AWSAccessKeyCredential" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "AWS_ACCESS_KEY": "#/components/schemas/AWSAccessKeyCredential" + } + } + } + } + }, + "AWSAccessKeyCredential": { + "required": [ + "type", + "accessKeyID", + "secretAccessKey" + ], + "type": "object", + "description": "AWS access key credentials: access key ID and secret access key.\n", + "properties": { + "type": { + "type": "string", + "description": "AWS_ACCESS_KEY credentials are used to access the AWS API programmatically.\n", + "enum": [ + "AWS_ACCESS_KEY" + ] + }, + "accessKeyID": { + "type": "string", + "description": "The access key ID of the AWS access key credential." + }, + "secretAccessKey": { + "type": "string", + "description": "The secret access key of the AWS access key credential." + } + } + }, + "AzureServicePrincipal": { + "required": [ + "type", + "clientID", + "clientSecret", + "tenantID" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "", + "enum": [ + "AZURE_SERVICE_PRINCIPAL" + ] + }, + "clientID": { + "type": "string", + "description": "The Client ID of the service principal." + }, + "clientSecret": { + "type": "string", + "description": "The secret associated with the service principal." + }, + "tenantID": { + "type": "string", + "description": "The ID for the Active Directory tenant to which the service principal belongs." + } + } + }, + "VSphereIntegration": { + "type": "object", + "description": "The VSphere integration stores the credentials for programmatic access to the VSphere cloud API.\n", + "required": [ + "type", + "hostname", + "credential" + ], + "properties": { + "type": { + "type": "string", + "description": "The VSPHERE_INTEGRATION is an Integration for connecting to the VSphere cloud.\n", + "enum": [ + "VSPHERE_INTEGRATION" + ] + }, + "hostname": { + "type": "string", + "description": "VSphere instance hostname ( FQDN or IP ), Connection to it from the controller is through https, the VSphere server certificate is not verified." + }, + "rawCa": { + "type": "string", + "description": "Raw CA Certificate used to verify the vSphere server certificate", + "example": "-----BEGIN CERTIFICATE-----\n MIIDMTCCasdfAwIBAgIUWw25xyNvQPxtjGUZopz0KeoaaQkwDQYJKoZIhvcNAQEL\n [SNIP]\n 2CPqdhpmQhAbzx9ElT8KyC7/08IdV0JK/kSWjfE4jOPOJyI2q0DWExKLuYe+rO+Q\n rg7hesA=\n -----END CERTIFICATE-----" + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserPassCredential" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "USER_PASS": "#/components/schemas/UserPassCredential" + } + } + } + } + }, + "GenericIntegration": { + "required": [ + "type", + "endpointUri", + "credential" + ], + "type": "object", + "description": "A Generic integration resource stores the credentials and URI endpoint to connect to external services\nthat require a username and password or API token for authentication, or accept unauthenticated connection.\n", + "properties": { + "type": { + "type": "string", + "description": "The GENERIC_INTEGRATION is an Integration for connecting to external services that require a\nusername and password or an API key, or accept an unauthenticated connection.\n", + "enum": [ + "GENERIC_INTEGRATION" + ] + }, + "endpointUri": { + "type": "string", + "description": "The URI of the service endpoint." + }, + "credential": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserPassCredential" + }, + { + "$ref": "#/components/schemas/ApiKeyCredential" + }, + { + "$ref": "#/components/schemas/Unauthenticated" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "USER_PASS": "#/components/schemas/UserPassCredential", + "API_KEY": "#/components/schemas/ApiKeyCredential", + "UNAUTHENTICATED": "#/components/schemas/Unauthenticated" + } + } + } + } + }, + "UserPassCredential": { + "description": "A credential consisting of a username and password. In the case of splunk HEC, username can be any string.", + "required": [ + "type", + "password", + "username" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "USER_PASS credentials are used to connect to web services that accept a username and password for authentication.\n", + "enum": [ + "USER_PASS" + ] + }, + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "ApiKeyCredential": { + "description": "For API key based authentication.", + "required": [ + "type", + "apiKey" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "API_KEY credentials are used to connect to web services that accept an API key for authentication.\n", + "enum": [ + "API_KEY" + ] + }, + "apiKey": { + "type": "string" + } + } + }, + "Unauthenticated": { + "description": "For unauthenticated connections.", + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Unauthenticated can be used for services that do not need authentication.\n", + "enum": [ + "UNAUTHENTICATED" + ] + } + } + }, + "GroupListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Group" + }, + "description": "Contains list of authentication groups.\n" + } + } + }, + "Group": { + "type": "object", + "required": [ + "metadata", + "desiredState" + ], + "properties": { + "metadata": { + "$ref": "#/components/schemas/ResourceMeta" + }, + "desiredState": { + "$ref": "#/components/schemas/GroupDef" + }, + "currentStatus": { + "$ref": "#/components/schemas/GroupDef" + } + } + }, + "GroupDef": { + "type": "object", + "required": [ + "roles" + ], + "description": "An authentication group (or \"AuthN Group\") is a collection of Roles. All AuthN Groups are globally unique. You can assign AuthN Groups to external authentication provider properties (such as an AD Group).\n", + "properties": { + "roles": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/ResourceRef" + } + } + } + } + }, + "examples": { + "AWSRequest": { + "value": { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ] + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY)" + } + } + } + }, + "AWSResponse": { + "value": { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "SplunkRequest": { + "value": { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ] + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "********" + } + } + } + }, + "SplunkResponse": { + "value": { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*********" + } + }, + "currentStatus": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*********" + } + } + } + }, + "AWSRequestForPatch": { + "value": { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ] + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "AWSResponseForPatch": { + "value": { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + } + }, + "SplunkRequestForPatch": { + "value": { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ] + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "********" + } + } + } + }, + "SplunkResponseForPatch": { + "value": { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*********" + } + }, + "currentStatus": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*********" + } + } + } + }, + "ListIntegrationResponse": { + "value": { + "items": [ + { + "metadata": { + "name": "my-aws-integration", + "description": "AWS integration for us-west-1", + "displayName": "UsWest1-Integration", + "tags": [ + "us-west-1" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + }, + "currentStatus": { + "type": "AWS_INTEGRATION", + "endpointUri": "https://ec2.us-west-1.amazonaws.com", + "credential": { + "type": "AWS_ACCESS_KEY", + "accessKeyID": "", + "secretAccessKey": "*********" + } + } + }, + { + "metadata": { + "name": "my-splunk-integration", + "description": "Splunk integration", + "displayName": "splunk-Integration", + "tags": [ + "dev" + ], + "uid": "619887de-a748-4931-853d-c6b706f95ddf", + "createTime": "2019-09-18T16:42:15.1183523Z", + "updateTime": "2019-09-18T16:42:15.1183523Z" + }, + "desiredState": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*****" + } + }, + "currentStatus": { + "type": "GENERIC_INTEGRATION", + "endpointUri": "https://splunk.com:8080/services/collector", + "credential": { + "type": "USER_PASS", + "user": "x", + "password": "*****" + } + } + } + ] + } + }, + "NotFoundError": { + "value": { + "code": 120003, + "message": "Error getting the Integration resource: the specified integration does not exist. Check the name of the Integration resource, then try again." + } + }, + "BadRequestError": { + "value": { + "code": 120004, + "message": "Error creating the Integration resource: could not parse the request payload. Check the format of the request, then try again." + } + }, + "AlreadyExistsError": { + "value": { + "code": 120007, + "message": "Error creating the Integration resource: the integration already exists. Use a unique name for the Integration resource, then try again." + } + } + } + } +}