diff --git a/.gitignore b/.gitignore index a2f74f3e..96c1c4a0 100644 --- a/.gitignore +++ b/.gitignore @@ -21,8 +21,8 @@ Thumbs.db /.idea/ /venv/ /src/__pycache__/ -/src/v5_4/__pycache__/ /src/v5_5/__pycache__/ +/src/v5_6/__pycache__/ /contrib/devportal/redocly/src/__pycache__/ # Test coverage artifacts # diff --git a/FEATURES.md b/FEATURES.md index 087256a2..948a0b70 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -4,14 +4,14 @@ NGINX Declarative API has been tested with the following NGINX control plane releases: -| Control plane | API v5.4 | API v5.5 | Notes | +| Control plane | API v5.5 | API v5.6 | Notes | |---------------------------|----------------------|----------------------|--------| | NGINX Instance Manager | 2.18+ | 2.20+ | | | NGINX One Console | General availability | General availability | | ### NGINX `http` and `stream` servers -| Feature | API v5.4 | API v5.5 | Notes | +| Feature | API v5.5 | API v5.6 | Notes | |-----------------------------|----------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Upstreams | X | X |
  • Snippets supported: static and from source of truth
  • | | HTTP servers | X | X |
  • Snippets supported (`http`, `servers`, `locations`): static and from source of truth
  • | @@ -43,7 +43,7 @@ Locations `.declaration.http.servers[].locations[].uri` match modifiers in `.dec ### NGINX API Gateway use case -| Feature | API v5.4 | API v5.5 | Notes | +| Feature | API v5.5 | API v5.6 | Notes | |--------------------------------------------------------------|-------------------------------------------------------------------------------|-------------------------------------------------------------------------------|-----------------------------------------------| | Configuration generation from OpenAPI schema | X | X | OpenAPI 2.0, 3.0, 3.0.1, YAML and JSON format | | HTTP methods enforcement | X | X | | @@ -92,21 +92,21 @@ See the [Postman collection](/contrib/) for usage examples ### NGINX API Gateway use case - Developer Portal -| Type | API v5.4 | API v5.5 | Notes | +| Type | API v5.5 | API v5.6 | Notes | |-----------------|----------|----------|------------------------------------------| | Redocly | X | X | Developer portal published by NGINX Plus | | Backstage.io | X | X | Backstage YAML manifest generated | ### NGINX API Gateway use case - Visibility -| Type | API v5.4 | API v5.5 | Notes | +| Type | API v5.5 | API v5.6 | Notes | |---------------|----------|----------|-----------------------------------------------------------------------------------------------| | Moesif | X | X | Integration with Moesif - see https://www.moesif.com/docs/server-integration/nginx-openresty/ | ### TLS -| Type | Description | API v5.4 | API v5.5 | Notes | +| Type | Description | API v5.5 | API v5.6 | Notes | |-------|-------------------------|----------|----------|-------| | ACME | ACME Protocol support | X | X | | @@ -130,7 +130,7 @@ For full details for all fields see https://nginx.org/en/docs/http/ngx_http_acme ### Client authentication -| Type | Description | API v5.4 | API v5.5 | Notes | +| Type | Description | API v5.5 | API v5.6 | Notes | |------|----------------------|----------|----------|-------------------------------------| | jwt | JSON Web Token (JWT) | X | X | | | mtls | Mutual TLS | X | X |
  • Supported for HTTP servers
  • | @@ -208,7 +208,7 @@ For additional details see https://nginx.org/en/docs/http/ngx_http_oidc_module.h ### Client authorization -| Type | Description | API v5.4 | API v5.5 | Notes | +| Type | Description | API v5.5 | API v5.6 | Notes | |------|------------------------|----------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | jwt | JSON Web Token (JWT) | X | X | Based on JWT claims. Supported under
  • .declaration.http.servers[]
  • .declaration.http.servers[].location[]
  • .declaration.http.servers[].location[].apigateway
  • | @@ -238,7 +238,7 @@ Client-side authorization profiles to be defined under `.declaration.http.author ### Upstream and Source of truth authentication -| Type | Description | API v5.4 | API v5.5 | Notes | +| Type | Description | API v5.5 | API v5.6 | Notes | |--------------|------------------------------------------------|----------|----------|----------------------------------------------------------------------------------------| | Bearer token | Authentication token as Authorization Bearer | X | X | `Bearer` Authorization header is injected in requests to upstreams and source of truth | | Basic Auth | Authentication token as Authorization Basic | X | X | `Basic` Authorization header is injected in requests to upstreams and source of truth | @@ -306,7 +306,7 @@ Server-side authentication profiles to be defined under `.declaration.http.authe ### HTTP Headers manipulation -| Type | API v5.4 | API v5.5 | Notes | +| Type | API v5.5 | API v5.6 | Notes | |-------------------------------|----------|----------|------------------------------------------------------------------------------------------------------------------------------| | Request (client to server) | X | X |
  • `set` - new header injection
  • `delete` - client header removal
  • | | Response (server to client) | X | X |
  • `add` - new header injection
  • `delete` - server header removal
  • `replace` - server header replacement
  • | @@ -355,7 +355,7 @@ To be defined under `.declaration.http.servers[].headers` and/or `.declaration.h ### NGINX Javascript -| Hook type | API v5.4 | API v5.5 | Notes | +| Hook type | API v5.5 | API v5.6 | Notes | |---------------------|----------|----------|--------------------------------------------------------------------------------------------------------------------------------| | js_body_filter | X | X | Available in
  • `declaration.http.servers[].location[]`
  • | | js_content | X | X | Available in
  • `declaration.http.servers[].location[]`
  • | @@ -509,7 +509,7 @@ Example hooks: ### DNS resolvers -| | API v5.4 | API v5.5 | Notes | +| | API v5.5 | API v5.6 | Notes | |-------------------------|----------|----------|------------------------------------------------------------------------------------------------------------------------------------| | DNS resolver profiles | X | X | Available in
  • `declaration.http.servers[]`
  • `declaration.http.upstreams[]`
  • `declaration.layer4.upstreams[]`
  • | @@ -532,13 +532,13 @@ DNS resolver profiles to be defined under `.declaration.http.resolvers[]` #### HTTP Access and error logging -| | API v5.4 | API v5.5 | Notes | +| | API v5.5 | API v5.6 | Notes | |---------|----------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Logging | X | X | Available in
  • `.declaration.http.servers[].log`
  • `.declaration.http.servers[].locations[].log`

  • `condition` enables conditional logging. Logging will be disabled if `condition` evaluates to "0" or an empty string | ### Access logging formats -| | API v5.4 | API v5.5 | Notes | +| | API v5.5 | API v5.6 | Notes | |-----------------|----------|----------|-------| | Logging formats | X | X | | diff --git a/README.md b/README.md index 170e5a2b..676da378 100644 --- a/README.md +++ b/README.md @@ -45,12 +45,12 @@ A **blog article** to automate NGINX API Gateway management from OpenAPI schemas ## ๐Ÿš€ Supported releases -- [F5 NGINX Instance Manager 2.14+](https://docs.nginx.com/nginx-instance-manager/) +- [F5 NGINX Instance Manager 2.20+](https://docs.nginx.com/nginx-instance-manager/) - [F5 NGINX One Console](https://docs.nginx.com/nginx-one/) - [F5 NGINX Plus R33+](https://docs.nginx.com/nginx/) - [F5 WAF for NGINX](https://docs.nginx.com/waf/) -**Note**: F5 NGINX Plus R33 and above [require a valid license](https://docs.nginx.com/solutions/about-subscription-licenses/) and the `.output.license` section in the declarative JSON is required. See the [usage notes](/USAGE-v5.4.md) for further details. [Postman collection](/contrib/postman) examples are provided for NGINX Plus R33+. +**Note**: F5 NGINX Plus R33 and above [require a valid license](https://docs.nginx.com/solutions/about-subscription-licenses/) and the `.output.license` section in the declarative JSON is required. ## ๐Ÿ› ๏ธ Architecture @@ -198,15 +198,6 @@ NGINX Declarative API ->> CI/CD Pipeline: Response end ``` -## ๐Ÿงฉ Input formats - -- [X] Declarative JSON - -## ๐Ÿงพ Output formats - -- [X] Output to F5 NGINX Instance Manager 2.14+ imperative REST API (instance group) -- [X] Output to F5 NGINX One Console REST API (config sync group) - ## ๐ŸŒŸ Supported features See the [features list](/FEATURES.md) @@ -215,8 +206,8 @@ See the [features list](/FEATURES.md) Usage details and JSON schema are available here: -- [API v5.5](/USAGE-v5.5.md) - latest -- [API v5.4](/USAGE-v5.4.md) - stable +- [API v5.6](/USAGE-v5.6.md) - latest +- [API v5.5](/USAGE-v5.5.md) - stable A sample Postman collection and usage instructions can be found [here](/contrib/postman) diff --git a/USAGE-v5.5.md b/USAGE-v5.5.md index 0e0aaf3e..8d7da3a3 100644 --- a/USAGE-v5.5.md +++ b/USAGE-v5.5.md @@ -58,7 +58,8 @@ The JSON schema is self explanatory. See also the [sample Postman collection](/c ### API endpoints -- `POST /v5.5/config/` - Publish a new declaration +- `GET /v5.5/schema` - Get Declarative API JSON schema +- `POST /v5.5/config` - Publish a new declaration - `PATCH /v5.5/config/{config_uid}` - Update an existing declaration - Per-HTTP server CRUD - Per-HTTP upstream CRUD diff --git a/USAGE-v5.4.md b/USAGE-v5.6.md similarity index 58% rename from USAGE-v5.4.md rename to USAGE-v5.6.md index 4ed88b24..b41c0bbb 100644 --- a/USAGE-v5.4.md +++ b/USAGE-v5.6.md @@ -1,19 +1,22 @@ -# Usage for NGINX Declarative API v5.4 +# Usage for NGINX Declarative API v5.6 -Version 5.4 supports: +Version 5.6 supports: -- [NGINX Instance Manager](https://docs.nginx.com/nginx-management-suite/nim/) 2.14+. Version 2.18+ is required for NGINX R33 and above -- [NGINX One Console](https://docs.nginx.com/nginx-one/) -- [NGINX Plus](https://docs.nginx.com/nginx/) R31+ -- [NGINX App Protect WAF](https://docs.nginx.com/nginx-app-protect-waf/) v4 or v5 with precompiled [policy bundles](https://docs.nginx.com/nginx-app-protect-waf/v5/admin-guide/compiler/) +- [NGINX Instance Manager](https://docs.nginx.com/nginx-instance-manager/) 2.21+ +- [NGINX One Console](https://docs.nginx.com/nginx-one-console/) +- [NGINX Plus](https://docs.nginx.com/nginx/) R35+ +- [F5 WAF for NGINX](https://docs.nginx.com/waf/) with precompiled [policy bundles](https://docs.nginx.com/nginx-app-protect-waf/v5/admin-guide/compiler/) The JSON schema is self explanatory. See also the [sample Postman collection](/contrib/postman) for usage examples -- `.output.license` defines the JWT license to use for NGINX Plus R33+ - - `.output.license.endpoint` the usage reporting endpoint (defaults to `product.connect.nginx.com`). NGINX Instance Manager address can be used here +- `.output.license` defines the JWT license to use + - `.output.license.endpoint` the usage reporting endpoint (defaults to `product.connect.nginx.com`). NGINX Instance Manager address or FQDN can be used here - `.output.license.token` the JWT license token. If this field is omitted, it is assumed that a `/etc/nginx/license.jwt` token already exists on the instance and it won't be replaced - `.output.license.ssl_verify` set to `false` to trust all SSL certificates (not recommended). Useful for reporting to NGINX Instance Manager without a local PKI. - `.output.license.grace_period` Set to 'true' to begin the 180-day reporting enforcement grace period. Reporting must begin or resume before the end of the grace period to ensure continued operation + - `.output.license.proxy` The optional explicit forward proxy `IP_address:port` or `FQDN:port` for usage reporting + - `.output.license.proxy_username` The optional explicit forward proxy authentication username for usage reporting + - `.output.license.proxy_password` The optional explicit forward proxy authentication password for usage reporting - `.output.type` defines how NGINX configuration will be returned: - *nms* - NGINX configuration is published as a Staged Config to NGINX Instance Manager - `.output.nms.url` the NGINX Instance Manager URL @@ -23,19 +26,6 @@ The JSON schema is self explanatory. See also the [sample Postman collection](/c - `.output.nms.synctime` **optional**, used for GitOps autosync. When specified and the declaration includes HTTP(S) references to NGINX App Protect policies, TLS certificates/keys/chains, the HTTP(S) endpoints will be checked every `synctime` seconds and if external contents have changed, the updated configuration will automatically be published to NGINX Instance Manager - `.output.nms.synchronous` **optional**, when set to `True` (default) the NGINX Declarative API waits for NGINX Instance Manager successful reply after publishing the NGINX configuration. Setting this to `False` enqueues the request, supporting multiple JSON declarations to be submitted at the same time/from multiple clients. Currently supported for `PATCH` operations only. - `.output.nms.modules` an optional array of NGINX module names (ie. 'ngx_http_app_protect_module', 'ngx_http_js_module','ngx_stream_js_module') - - `.output.nms.certificates` an optional array of TLS certificates/keys/chains to be published - - `.output.nms.certificates[].type` the item type ('certificate', 'key', 'chain') - - `.output.nms.certificates[].name` the certificate/key/chain name with no path/extension (ie. 'test-application') - - `.output.nms.certificates[].contents` the content: this can be either base64-encoded or be a HTTP(S) URL that will be fetched dynamically from a source of truth - - `.output.nms.policies[]` an optional array of NGINX App Protect security policies - - `.output.nms.policies[].type` the policy type ('app_protect') - - `.output.nms.policies[].name` the policy name (ie. 'prod-policy') - - `.output.nms.policies[].active_tag` the policy tag to enable among all available versions (ie. 'v1') - - `.output.nms.policies[].versions[]` array with all available policy versions - - `.output.nms.policies[].versions[].tag` the policy version's tag name - - `.output.nms.policies[].versions[].displayName` the policy version's display name - - `.output.nms.policies[].versions[].description` the policy version's description - - `.output.nms.policies[].versions[].contents` this can be either base64-encoded or be a HTTP(S) URL that will be fetched dynamically from a source of truth - *nginxone* - NGINX configuration is published to a NGINX One Console config sync group - `.output.nginxone.url` the NGINX One Console URL - `.output.nginxone.namespace` the NGINX One Console namespace @@ -44,24 +34,34 @@ The JSON schema is self explanatory. See also the [sample Postman collection](/c - `.output.nginxone.synctime` **optional**, used for GitOps autosync. When specified and the declaration includes HTTP(S) references to NGINX App Protect policies, TLS certificates/keys/chains, the HTTP(S) endpoints will be checked every `synctime` seconds and if external contents have changed, the updated configuration will automatically be published to NGINX One Cloud Console - `.output.nms.synchronous` **optional**, when set to `True` (default) the NGINX Declarative API waits for NGINX One Console successful reply after publishing the NGINX configuration. Setting this to `False` enqueues the request, supporting multiple JSON declarations to be submitted at the same time/from multiple clients. Currently supported for `PATCH` operations only. - `.output.nginxone.modules` an optional array of NGINX module names (ie. 'ngx_http_app_protect_module', 'ngx_http_js_module','ngx_stream_js_module') - - `.output.nginxone.certificates` an optional array of TLS certificates/keys/chains to be published - - `.output.nginxone.certificates[].type` the item type ('certificate', 'key', 'chain') - - `.output.nginxone.certificates[].name` the certificate/key/chain name with no path/extension (ie. 'test-application') - - `.output.nginxone.certificates[].contents` the content: this can be either base64-encoded or be a HTTP(S) URL that will be fetched dynamically from a source of truth - `.declaration` describes the NGINX configuration to be created - - `.declaration.http[]` NGINX HTTP definitions - - `.declaration.layer4[]` NGINX TCP/UDP definitions - - `.declaration.resolvers[]` DNS resolvers definitions + - `.declaration.http` NGINX HTTP definitions + - `.declaration.http.policies[]` an optional array of NGINX App Protect security policies + - `.declaration.http.policies[].type` the policy type ('app_protect') + - `.declaration.http.policies[].name` the policy name (ie. 'prod-policy') + - `.declaration.http.policies[].active_tag` the policy tag to enable among all available versions (ie. 'v1') + - `.declaration.http.policies[].versions[]` array with all available policy versions + - `.declaration.http.policies[].versions[].tag` the policy version's tag name + - `.declaration.http.policies[].versions[].displayName` the policy version's display name + - `.declaration.http.policies[].versions[].description` the policy version's description + - `.declaration.http.policies[].versions[].contents` this can be either base64-encoded or be a HTTP(S) URL that will be fetched dynamically from a source of truth + - `.declaration.layer4` NGINX TCP/UDP definitions + - `.declaration.resolvers` DNS resolvers definitions + - `.declaration.certificates` an optional array of TLS certificates/keys/chains to be published + - `.declaration.certificates[].type` the item type ('certificate', 'key', 'chain') + - `.declaration.certificates[].name` the certificate/key/chain name with no path/extension (ie. 'test-application') + - `.declaration.certificates[].contents` the content: this can be either base64-encoded or be a HTTP(S) URL that will be fetched dynamically from a source of truth ### API endpoints -- `POST /v5.4/config/` - Publish a new declaration -- `PATCH /v5.4/config/{config_uid}` - Update an existing declaration +- `GET /v5.6/schema` - Get Declarative API JSON schema +- `POST /v5.6/config` - Publish a new declaration +- `PATCH /v5.6/config/{config_uid}` - Update an existing declaration - Per-HTTP server CRUD - Per-HTTP upstream CRUD - Per-Stream server CRUD - Per-Stream upstream CRUD - Per-NGINX App Protect WAF policy CRUD -- `GET /v5.4/config/{configUid}/submission/{submissionUid}` - Retrieve a submission (asynchronous `PATCH` request) status -- `GET /v5.4/config/{config_uid}` - Retrieve an existing declaration -- `DELETE /v5.4/config/{config_uid}` - Delete an existing declaration \ No newline at end of file +- `GET /v5.6/config/{configUid}/submission/{submissionUid}` - Retrieve a submission (asynchronous `PATCH` request) status +- `GET /v5.6/config/{config_uid}` - Retrieve an existing declaration +- `DELETE /v5.6/config/{config_uid}` - Delete an existing declaration diff --git a/contrib/gitops-examples/v5.4/NginxDefaultPolicy.json b/contrib/gitops-examples/v5.6/NginxDefaultPolicy.json similarity index 100% rename from contrib/gitops-examples/v5.4/NginxDefaultPolicy.json rename to contrib/gitops-examples/v5.6/NginxDefaultPolicy.json diff --git a/contrib/gitops-examples/v5.4/apigw.nginx.lab.crt b/contrib/gitops-examples/v5.6/apigw.nginx.lab.crt similarity index 100% rename from contrib/gitops-examples/v5.4/apigw.nginx.lab.crt rename to contrib/gitops-examples/v5.6/apigw.nginx.lab.crt diff --git a/contrib/gitops-examples/v5.4/apigw.nginx.lab.key b/contrib/gitops-examples/v5.6/apigw.nginx.lab.key similarity index 100% rename from contrib/gitops-examples/v5.4/apigw.nginx.lab.key rename to contrib/gitops-examples/v5.6/apigw.nginx.lab.key diff --git a/contrib/gitops-examples/v5.4/client.cert.pem b/contrib/gitops-examples/v5.6/client.cert.pem similarity index 100% rename from contrib/gitops-examples/v5.4/client.cert.pem rename to contrib/gitops-examples/v5.6/client.cert.pem diff --git a/contrib/gitops-examples/v5.4/client.key.pem b/contrib/gitops-examples/v5.6/client.key.pem similarity index 100% rename from contrib/gitops-examples/v5.4/client.key.pem rename to contrib/gitops-examples/v5.6/client.key.pem diff --git a/contrib/gitops-examples/v5.4/nap-policy-xss-allowed.json b/contrib/gitops-examples/v5.6/nap-policy-xss-allowed.json similarity index 100% rename from contrib/gitops-examples/v5.4/nap-policy-xss-allowed.json rename to contrib/gitops-examples/v5.6/nap-policy-xss-allowed.json diff --git a/contrib/gitops-examples/v5.4/nap-policy-xss-blocked-bot-allowed.json b/contrib/gitops-examples/v5.6/nap-policy-xss-blocked-bot-allowed.json similarity index 100% rename from contrib/gitops-examples/v5.4/nap-policy-xss-blocked-bot-allowed.json rename to contrib/gitops-examples/v5.6/nap-policy-xss-blocked-bot-allowed.json diff --git a/contrib/gitops-examples/v5.4/nap-policy-xss-blocked.json b/contrib/gitops-examples/v5.6/nap-policy-xss-blocked.json similarity index 100% rename from contrib/gitops-examples/v5.4/nap-policy-xss-blocked.json rename to contrib/gitops-examples/v5.6/nap-policy-xss-blocked.json diff --git a/contrib/gitops-examples/v5.4/testcert.chain b/contrib/gitops-examples/v5.6/testcert.chain similarity index 100% rename from contrib/gitops-examples/v5.4/testcert.chain rename to contrib/gitops-examples/v5.6/testcert.chain diff --git a/contrib/gitops-examples/v5.4/testcert.crt b/contrib/gitops-examples/v5.6/testcert.crt similarity index 100% rename from contrib/gitops-examples/v5.4/testcert.crt rename to contrib/gitops-examples/v5.6/testcert.crt diff --git a/contrib/gitops-examples/v5.4/testcert.key b/contrib/gitops-examples/v5.6/testcert.key similarity index 100% rename from contrib/gitops-examples/v5.4/testcert.key rename to contrib/gitops-examples/v5.6/testcert.key diff --git a/contrib/gitops-examples/v5.4/testcert2.chain b/contrib/gitops-examples/v5.6/testcert2.chain similarity index 100% rename from contrib/gitops-examples/v5.4/testcert2.chain rename to contrib/gitops-examples/v5.6/testcert2.chain diff --git a/contrib/gitops-examples/v5.4/testcert2.crt b/contrib/gitops-examples/v5.6/testcert2.crt similarity index 100% rename from contrib/gitops-examples/v5.4/testcert2.crt rename to contrib/gitops-examples/v5.6/testcert2.crt diff --git a/contrib/gitops-examples/v5.4/testcert2.key b/contrib/gitops-examples/v5.6/testcert2.key similarity index 100% rename from contrib/gitops-examples/v5.4/testcert2.key rename to contrib/gitops-examples/v5.6/testcert2.key diff --git a/contrib/gitops-examples/v5.6/waf-policy-owasp-top10.json b/contrib/gitops-examples/v5.6/waf-policy-owasp-top10.json new file mode 100644 index 00000000..e5d89676 --- /dev/null +++ b/contrib/gitops-examples/v5.6/waf-policy-owasp-top10.json @@ -0,0 +1,8 @@ +{ + "policy": { + "name": "nginx_waf_owasp_top10_policy", + "template": { + "name": "POLICY_TEMPLATE_NGINX_BASE" + } + } +} \ No newline at end of file diff --git a/contrib/helm/nginx-declarative-api/templates/service.yaml b/contrib/helm/nginx-declarative-api/templates/service.yaml index a597ade8..fe1c16c3 100644 --- a/contrib/helm/nginx-declarative-api/templates/service.yaml +++ b/contrib/helm/nginx-declarative-api/templates/service.yaml @@ -29,7 +29,7 @@ spec: apiVersion: v1 kind: Service metadata: - # Fixed name "redis" โ€” the app reads config.toml which hardcodes this hostname. + # Fixed name "redis" โ€” the app reads config.yaml which hardcodes this hostname. name: {{ include "nginx-declarative-api.redis.serviceName" . }} namespace: {{ include "nginx-declarative-api.namespace" . }} labels: diff --git a/contrib/postman/NGINX Declarative API.postman_collection.json b/contrib/postman/NGINX Declarative API.postman_collection.json index f5099b82..70a3655f 100644 --- a/contrib/postman/NGINX Declarative API.postman_collection.json +++ b/contrib/postman/NGINX Declarative API.postman_collection.json @@ -1,15 +1,15 @@ { "info": { - "_postman_id": "6fc2a74f-7e06-45e7-806b-1f9953d905c2", + "_postman_id": "6bcfa8d2-a3c5-4659-9255-c951d40420c5", "name": "NGINX Declarative API", "description": "Declarative REST API and GitOps automation layer for NGINX Instance Manager and NGINX One Console\n\n[https://github.com/f5devcentral/NGINX-Declarative-API/](https://github.com/f5devcentral/NGINX-Declarative-API/)", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "1667416", - "_collection_link": "https://orange-rocket-1353.postman.co/workspace/NGINX-Declarative-API~8ba6e9c1-a04b-4484-8193-bbb142560553/collection/1667416-6fc2a74f-7e06-45e7-806b-1f9953d905c2?action=share&source=collection_link&creator=1667416" + "_collection_link": "https://orange-rocket-1353.postman.co/workspace/NGINX-Declarative-API~8ba6e9c1-a04b-4484-8193-bbb142560553/collection/1667416-6bcfa8d2-a3c5-4659-9255-c951d40420c5?action=share&source=collection_link&creator=1667416" }, "item": [ { - "name": "v5.4", + "name": "v5.5", "item": [ { "name": "NGINX Instance Manager", @@ -2053,7 +2053,7 @@ "response": [] }, { - "name": "TLS Offload and NGINX App Protect", + "name": "TLS Offload and F5 WAF for NGINX", "event": [ { "listen": "test", @@ -5449,7 +5449,7 @@ "description": "[https://github.com/f5devcentral/NGINX-Declarative-API/blob/main/USAGE-v5.0.md](https://github.com/f5devcentral/NGINX-Declarative-API/blob/main/USAGE-v4.2.md)" }, { - "name": "v5.5", + "name": "v5.6", "item": [ { "name": "NGINX Instance Manager", @@ -5471,7 +5471,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -5480,7 +5481,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_acme_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"cacert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjekNDQTF1Z0F3SUJBZ0lVVnNRZkFaTW4vazNRTU9nc0RuVEdUaU9PbGJ3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TURrMU5EQTRXaGNOCk1qUXdOakEzTURrMU5EQTRXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMlQwWXpkcjB0dWQzaVJRNGNzaGNhRVJTRzVjTDE2CkhRblhoYWw4emlUL1VRQUNIUGdzZDYwcWlEaldvQTJXb0lGWFFpUHkzOG1vZGtWRlR4Qmt5U2VldndOOFJiLzEKOFhaMS8yS1RnVmRDcHkvNm11WE15bXZYODJad05CVkV3QnoxUk5kbklUSk44cVh3a0d4bHozbDBib1loRkFyUQpNdmkxcW1RaHpDa2Zpb041MVkrYlBXOXpTQlFQdXNrcXJYYzRqTTJ0VENNQ2pTcFlvd1hXM1ppRmc5WEJ1Z09aCjFmdWd1Zmw4K1FJYzNZSEFoL1Z1NloraXFEOGxQeGRKODlBeDZaazVtOGdkVG9JdUhBbUNWaHFpUXBGRjkzSTgKbkYrSnRuYnBaNTRJUTZBbWYrYiswakMxdmY4Kzg0WUppaEVzWExyaGMxZTRTZ2dwdzEvcWpDb21QblhGVjEzUwpsUG5kVlhVR0taa1ZKdXdZTjJyZElmd3YrdCs5MGhwUVBmNmFBTjRCamRxOXdkdkQzSXVnS2JYZG5CQ0FUTEY4ClYyRTFTSE9VZGdRY3duK1d1WDVVOGdPa3B2b2VFN0g1REJ6Rks1WTZ2SHZlaTRlNkp3RTRDK3FJL1BmbTgreTEKNEpsOFBSOW5JQmdGQ3hrZWpwa2tRQ0I5U0dvMVZidzZhWmdZd0VQNHh6YXFYYXV3L3F4c0oxNUkrRTBndEs1OApuWUtkM0hqelk5Slh6V0NVNTdXbmc2SzNvTTIzNXpyRzJnNm1FaHQ4SStDckVMUFNuZURjZU8zVlJkc2dlblBCCis4U1JxVU8vWG9LWHNEU3I5amoxdWluVzYwTG5MZ0Zmc3JQeGlQVlZlMFh1TFZESlhCSlNoRDZDeGRyMnBSOGQKS25SRDZrTFpZZEtMQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqVwpWREFmQmdOVkhTTUVHREFXZ0JRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqV1ZEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJad3B4Z2Z4N2thZFhvRHNyT1hUVXJ6dEFPMkFQRVJNaTAKaTkyNk9DTGFPbVVYZW1uKytXSUU1K2tUSE0wcS8vbUZCTURzSmdZSFVLUlNvRGNsNmh4TnVFNUNzS2trRVFTSgpMTHZrWlB0S2J5NGlxMitLZ1JtdVZxbXJNVTBYQzZMZDl3WmttL2huUjNtT3V6bko4MGZmV1JDQ0xGWDEwY2EzCnc5TGM1d1JLTFBZZXQvcEs5SitOYWN3TFJRYTczVFovMUpQNW9BU3czVjNoYkxlLy9UeWpnOURqUlZGY3FYWnEKWWs2Mm5qSkhZVzh3WmlhZzc0QXU4dHE5OG5KandBV1ROMFV5L2w1Q2VpWnV5bzZlU0RHVDNJNm1BdGU1VXBvWAppNXBkYlZ6VDdOZC9IOEwwZHZNdVZ2N0FmakZlcU91cUZNNkkzTnlvbStLWENxNmJQdGxBWEkzeVFZc0t4ZlRkCkw3SnRaTmx6MGJ6eHJhcHI4RmpYcjhML1ZkeHQza00xMnJwb2kzL3hsckR6Q2Q2b2YrQ1MxelBocUdpOUhvcUoKZEU5VGhYMklTdkd2akVSYzVVNFRsNjJBNHNyeGJQbUt0eWx3dGNGVEJacUJiRGY3ZjBBc2cveWhndXdTcktsQQpBNkRWVXVCRFErdGpwZ0N0b0ZlOEhLVDJ6UFVlaEQ2ZjVNQkhmU2ZUZ1crTlhFSXNvVDNsampjY1hsYXhPcFJWCkNQNWxCczNmekxyYnBxbUlLaWZhdWlTNWM4TzlSUjhjQTVzeWlBOTBmbmJIdDlmdGxpRG9jcFRzNUtrbjk2NkIKZUxMM1dXVldCYUtvanJzY1RkVXJoalNnVVBmam5FTXpnVzR2eEc3d3BVNHR2ME4yaEtHUWc0bVhhcDV0SU5Pcwp4WktnZXRHUldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"resolver\": \"Google\",\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"acme_issuer\": \"ACME example issuer\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"acme_issuers\": [\n {\n \"name\": \"ACME example issuer\",\n \"uri\": \"https://acme.example.com/directory\",\n \"contact\": \"admin@example.test\",\n \"account_key\": \"rsa:2048\",\n \"ssl_verify\": true,\n \"ssl_trusted_certificate\": \"cacert\",\n \"accept_terms_of_service\": true\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_acme_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"resolver\": \"Google\",\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"acme_issuer\": \"ACME example issuer\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"acme_issuers\": [\n {\n \"name\": \"ACME example issuer\",\n \"uri\": \"https://acme.example.com/directory\",\n \"contact\": \"admin@example.test\",\n \"account_key\": \"rsa:2048\",\n \"ssl_verify\": true,\n \"ssl_trusted_certificate\": \"cacert\",\n \"accept_terms_of_service\": true\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"cacert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjekNDQTF1Z0F3SUJBZ0lVVnNRZkFaTW4vazNRTU9nc0RuVEdUaU9PbGJ3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TURrMU5EQTRXaGNOCk1qUXdOakEzTURrMU5EQTRXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMlQwWXpkcjB0dWQzaVJRNGNzaGNhRVJTRzVjTDE2CkhRblhoYWw4emlUL1VRQUNIUGdzZDYwcWlEaldvQTJXb0lGWFFpUHkzOG1vZGtWRlR4Qmt5U2VldndOOFJiLzEKOFhaMS8yS1RnVmRDcHkvNm11WE15bXZYODJad05CVkV3QnoxUk5kbklUSk44cVh3a0d4bHozbDBib1loRkFyUQpNdmkxcW1RaHpDa2Zpb041MVkrYlBXOXpTQlFQdXNrcXJYYzRqTTJ0VENNQ2pTcFlvd1hXM1ppRmc5WEJ1Z09aCjFmdWd1Zmw4K1FJYzNZSEFoL1Z1NloraXFEOGxQeGRKODlBeDZaazVtOGdkVG9JdUhBbUNWaHFpUXBGRjkzSTgKbkYrSnRuYnBaNTRJUTZBbWYrYiswakMxdmY4Kzg0WUppaEVzWExyaGMxZTRTZ2dwdzEvcWpDb21QblhGVjEzUwpsUG5kVlhVR0taa1ZKdXdZTjJyZElmd3YrdCs5MGhwUVBmNmFBTjRCamRxOXdkdkQzSXVnS2JYZG5CQ0FUTEY4ClYyRTFTSE9VZGdRY3duK1d1WDVVOGdPa3B2b2VFN0g1REJ6Rks1WTZ2SHZlaTRlNkp3RTRDK3FJL1BmbTgreTEKNEpsOFBSOW5JQmdGQ3hrZWpwa2tRQ0I5U0dvMVZidzZhWmdZd0VQNHh6YXFYYXV3L3F4c0oxNUkrRTBndEs1OApuWUtkM0hqelk5Slh6V0NVNTdXbmc2SzNvTTIzNXpyRzJnNm1FaHQ4SStDckVMUFNuZURjZU8zVlJkc2dlblBCCis4U1JxVU8vWG9LWHNEU3I5amoxdWluVzYwTG5MZ0Zmc3JQeGlQVlZlMFh1TFZESlhCSlNoRDZDeGRyMnBSOGQKS25SRDZrTFpZZEtMQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqVwpWREFmQmdOVkhTTUVHREFXZ0JRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqV1ZEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJad3B4Z2Z4N2thZFhvRHNyT1hUVXJ6dEFPMkFQRVJNaTAKaTkyNk9DTGFPbVVYZW1uKytXSUU1K2tUSE0wcS8vbUZCTURzSmdZSFVLUlNvRGNsNmh4TnVFNUNzS2trRVFTSgpMTHZrWlB0S2J5NGlxMitLZ1JtdVZxbXJNVTBYQzZMZDl3WmttL2huUjNtT3V6bko4MGZmV1JDQ0xGWDEwY2EzCnc5TGM1d1JLTFBZZXQvcEs5SitOYWN3TFJRYTczVFovMUpQNW9BU3czVjNoYkxlLy9UeWpnOURqUlZGY3FYWnEKWWs2Mm5qSkhZVzh3WmlhZzc0QXU4dHE5OG5KandBV1ROMFV5L2w1Q2VpWnV5bzZlU0RHVDNJNm1BdGU1VXBvWAppNXBkYlZ6VDdOZC9IOEwwZHZNdVZ2N0FmakZlcU91cUZNNkkzTnlvbStLWENxNmJQdGxBWEkzeVFZc0t4ZlRkCkw3SnRaTmx6MGJ6eHJhcHI4RmpYcjhML1ZkeHQza00xMnJwb2kzL3hsckR6Q2Q2b2YrQ1MxelBocUdpOUhvcUoKZEU5VGhYMklTdkd2akVSYzVVNFRsNjJBNHNyeGJQbUt0eWx3dGNGVEJacUJiRGY3ZjBBc2cveWhndXdTcktsQQpBNkRWVXVCRFErdGpwZ0N0b0ZlOEhLVDJ6UFVlaEQ2ZjVNQkhmU2ZUZ1crTlhFSXNvVDNsampjY1hsYXhPcFJWCkNQNWxCczNmekxyYnBxbUlLaWZhdWlTNWM4TzlSUjhjQTVzeWlBOTBmbmJIdDlmdGxpRG9jcFRzNUtrbjk2NkIKZUxMM1dXVldCYUtvanJzY1RkVXJoalNnVVBmam5FTXpnVzR2eEc3d3BVNHR2ME4yaEtHUWc0bVhhcDV0SU5Pcwp4WktnZXRHUldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -5508,68 +5509,18 @@ "name": "API Gateway", "item": [ { - "name": "Petstore API", + "name": "APIs.guru", "item": [ { "name": "API Client test requests", "item": [ { - "name": "Get Inventory (legitimate request)", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "https://apigw.nginx.lab/petstore/store/inventory", - "protocol": "https", - "host": [ - "apigw", - "nginx", - "lab" - ], - "path": [ - "petstore", - "store", - "inventory" - ] - } - }, - "response": [] - }, - { - "name": "Get Inventory (malicious query string)", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "https://apigw.nginx.lab/petstore/store/inventory?/etc/passwd", - "protocol": "https", - "host": [ - "apigw", - "nginx", - "lab" - ], - "path": [ - "petstore", - "store", - "inventory" - ], - "query": [ - { - "key": "/etc/passwd", - "value": null - } - ] - } - }, - "response": [] - }, - { - "name": "Get Inventory (XSS attack)", + "name": "Metrics", "request": { "method": "GET", "header": [], "url": { - "raw": "https://apigw.nginx.lab/petstore/store/inventory?", + "raw": "https://apigw.nginx.lab/apiguru/metrics.json", "protocol": "https", "host": [ "apigw", @@ -5577,27 +5528,20 @@ "lab" ], "path": [ - "petstore", - "store", - "inventory" - ], - "query": [ - { - "key": "", - "value": null - } + "apiguru", + "metrics.json" ] } }, "response": [] }, { - "name": "Login without token", + "name": "Providers - no authentication", "request": { "method": "GET", "header": [], "url": { - "raw": "https://apigw.nginx.lab/petstore/user/login", + "raw": "https://apigw.nginx.lab/apiguru/providers.json", "protocol": "https", "host": [ "apigw", @@ -5605,16 +5549,15 @@ "lab" ], "path": [ - "petstore", - "user", - "login" + "apiguru", + "providers.json" ] } }, "response": [] }, { - "name": "Login with \"DevOps\" token", + "name": "Providers - auth with \"DevOps\" token", "request": { "auth": { "type": "bearer", @@ -5629,7 +5572,7 @@ "method": "GET", "header": [], "url": { - "raw": "https://apigw.nginx.lab/petstore/user/login", + "raw": "https://apigw.nginx.lab/apiguru/providers.json", "protocol": "https", "host": [ "apigw", @@ -5637,16 +5580,15 @@ "lab" ], "path": [ - "petstore", - "user", - "login" + "apiguru", + "providers.json" ] } }, "response": [] }, { - "name": "Login with \"Guest\" token", + "name": "Providers - auth with \"Guest\" token", "request": { "auth": { "type": "bearer", @@ -5661,7 +5603,7 @@ "method": "GET", "header": [], "url": { - "raw": "https://apigw.nginx.lab/petstore/user/login", + "raw": "https://apigw.nginx.lab/apiguru/providers.json", "protocol": "https", "host": [ "apigw", @@ -5669,16 +5611,15 @@ "lab" ], "path": [ - "petstore", - "user", - "login" + "apiguru", + "providers.json" ] } }, "response": [] }, { - "name": "Login with dual (DevOps & Guest) role token", + "name": "Providers - auth with \"DevOps\" and \"Guest\" token", "request": { "auth": { "type": "bearer", @@ -5693,130 +5634,7 @@ "method": "GET", "header": [], "url": { - "raw": "https://apigw.nginx.lab/petstore/user/login", - "protocol": "https", - "host": [ - "apigw", - "nginx", - "lab" - ], - "path": [ - "petstore", - "user", - "login" - ] - } - }, - "response": [] - }, - { - "name": "Upload pet image without token", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/octet-stream", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqChYRcchQXbSLijjWKhShQqgVWnUwuX5Ck4YkxcVRcC04+LFYdXBx1tXBVRAEP0CcHZwUXaTE/yWFFjEeHPfj3b3H3TtAaFSYanbFAFWzjFQiLmayq2LwFQEI6Mc4BmVm6nOSlITn+LqHj693UZ7lfe7P0ZvLmwzwicQxphsW8QbxzKalc94nDrOSnCM+J54w6ILEj1xXXH7jXHRY4JlhI52aJw4Ti8UOVjqYlQyVeJo4klM1yhcyLuc4b3FWKzXWuid/YSivrSxzneYIEljEEiSIUFBDGRVYiNKqkWIiRftxD/+w45fIpZCrDEaOBVShQnb84H/wu1uzMDXpJoXiQODFtj9GgeAu0Kzb9vexbTdPAP8zcKW1/dUGMPtJer2tRY6Avm3g4rqtKXvA5Q4w9KTLhuxIfppCoQC8n9E3ZYGBW6Bnze2ttY/TByBNXSVvgINDYKxI2ese7+7u7O3fM63+fgB5bXKpzZcBIwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFAhArKAvJglcAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC" - }, - "url": { - "raw": "https://apigw.nginx.lab/petstore/pet/1/uploadImage", - "protocol": "https", - "host": [ - "apigw", - "nginx", - "lab" - ], - "path": [ - "petstore", - "pet", - "1", - "uploadImage" - ] - } - }, - "response": [] - }, - { - "name": "Upload pet image with \"DevOps\" token", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/octet-stream", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqChYRcchQXbSLijjWKhShQqgVWnUwuX5Ck4YkxcVRcC04+LFYdXBx1tXBVRAEP0CcHZwUXaTE/yWFFjEeHPfj3b3H3TtAaFSYanbFAFWzjFQiLmayq2LwFQEI6Mc4BmVm6nOSlITn+LqHj693UZ7lfe7P0ZvLmwzwicQxphsW8QbxzKalc94nDrOSnCM+J54w6ILEj1xXXH7jXHRY4JlhI52aJw4Ti8UOVjqYlQyVeJo4klM1yhcyLuc4b3FWKzXWuid/YSivrSxzneYIEljEEiSIUFBDGRVYiNKqkWIiRftxD/+w45fIpZCrDEaOBVShQnb84H/wu1uzMDXpJoXiQODFtj9GgeAu0Kzb9vexbTdPAP8zcKW1/dUGMPtJer2tRY6Avm3g4rqtKXvA5Q4w9KTLhuxIfppCoQC8n9E3ZYGBW6Bnze2ttY/TByBNXSVvgINDYKxI2ese7+7u7O3fM63+fgB5bXKpzZcBIwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFAhArKAvJglcAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC" - }, - "url": { - "raw": "https://apigw.nginx.lab/petstore/pet/1/uploadImage", - "protocol": "https", - "host": [ - "apigw", - "nginx", - "lab" - ], - "path": [ - "petstore", - "pet", - "1", - "uploadImage" - ] - } - }, - "response": [] - }, - { - "name": "Upload pet image with \"Guest\" token", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDk3NjQ3NTMsImV4cCI6MTcwOTc2NDc1NH0.eyJuYW1lIjoiQWxpY2UgR3Vlc3QiLCJzdWIiOiJKV1Qgc3ViIGNsYWltIiwiaXNzIjoiSldUIGlzcyBjbGFpbSIsInJvbGVzIjpbImd1ZXN0Il19.jFJDq-33irz7uFxdI8c8fIb5TwTAU5BlemmIFVALUAE", - "type": "string" - } - ] - }, - "method": "POST", - "header": [], - "body": { - "mode": "formdata", - "formdata": [ - { - "key": "file", - "value": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqChYRcchQXbSLijjWKhShQqgVWnUwuX5Ck4YkxcVRcC04+LFYdXBx1tXBVRAEP0CcHZwUXaTE/yWFFjEeHPfj3b3H3TtAaFSYanbFAFWzjFQiLmayq2LwFQEI6Mc4BmVm6nOSlITn+LqHj693UZ7lfe7P0ZvLmwzwicQxphsW8QbxzKalc94nDrOSnCM+J54w6ILEj1xXXH7jXHRY4JlhI52aJw4Ti8UOVjqYlQyVeJo4klM1yhcyLuc4b3FWKzXWuid/YSivrSxzneYIEljEEiSIUFBDGRVYiNKqkWIiRftxD/+w45fIpZCrDEaOBVShQnb84H/wu1uzMDXpJoXiQODFtj9GgeAu0Kzb9vexbTdPAP8zcKW1/dUGMPtJer2tRY6Avm3g4rqtKXvA5Q4w9KTLhuxIfppCoQC8n9E3ZYGBW6Bnze2ttY/TByBNXSVvgINDYKxI2ese7+7u7O3fM63+fgB5bXKpzZcBIwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFAhArKAvJglcAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC", - "type": "text" - }, - { - "key": "type", - "value": "image/png", - "type": "text" - } - ] - }, - "url": { - "raw": "https://apigw.nginx.lab/petstore/pet/1/uploadImage", + "raw": "https://apigw.nginx.lab/apiguru/providers.json", "protocol": "https", "host": [ "apigw", @@ -5824,10 +5642,8 @@ "lab" ], "path": [ - "petstore", - "pet", - "1", - "uploadImage" + "apiguru", + "providers.json" ] } }, @@ -5837,7 +5653,7 @@ "description": "This folder contains requests to access the Petstore API published through NGINX using the Declarative API" }, { - "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + redocly", + "name": "APIGuru API Gateway RateLimit + JWT AuthN/AuthZ + redocly - YAML OpenAPI schema", "event": [ { "listen": "test", @@ -5850,7 +5666,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -5859,7 +5676,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"APIGuru\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/apiguru\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://api.apis.guru/v2/openapi.yaml\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://api.apis.guru/v2/\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/apiguru-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"apigw_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/metrics.json\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"apigw_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"API Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -5882,7 +5699,7 @@ "response": [] }, { - "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + backstage", + "name": "APIGuru API Gateway RateLimit + JWT AuthN/AuthZ + redocly + WAF - YAML OpenAPI schema", "event": [ { "listen": "test", @@ -5895,7 +5712,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -5904,7 +5722,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": true\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"APIGuru\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/apiguru\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://api.apis.guru/v2/openapi.yaml\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://api.apis.guru/v2/\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/apiguru-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"apigw_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/metrics.json\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"owasp-top10\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"apigw_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"API Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"owasp-top10\",\n \"active_tag\": \"default\",\n \"versions\": [\n {\n \"tag\": \"default\",\n \"displayName\": \"Production Policy - OWASP top 10 protection\",\n \"description\": \"This is a production-ready policy - OWASP top 10 protection\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/waf-policy-owasp-top10.json\"\n }\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -5927,7 +5745,7 @@ "response": [] }, { - "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + redocly + moesif", + "name": "APIGuru API Gateway RateLimit + JWT AuthN/AuthZ + redocly - local OpenAPI schema", "event": [ { "listen": "test", @@ -5940,7 +5758,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -5949,7 +5768,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"APIGuru\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/apiguru\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"eyJvcGVuYXBpIjoiMy4wLjAiLCJ4LW9wdGljLXVybCI6Imh0dHBzOi8vYXBwLnVzZW9wdGljLmNvbS9vcmdhbml6YXRpb25zL2ZlYmY4YWM2LWVlNjctNDU2NS1iNDVhLTVjODVhNDY5ZGNhNy9hcGlzL18wZktXcVV2aHM5c3NZTmtxMWstYyIsIngtb3B0aWMtc3RhbmRhcmQiOiJAZmViZjhhYzYtZWU2Ny00NTY1LWI0NWEtNWM4NWE0NjlkY2E3L0Z6NktVM193TUlPNWlKNl9WVVozMCIsImluZm8iOnsidmVyc2lvbiI6IjIuMi4wIiwidGl0bGUiOiJBUElzLmd1cnUiLCJkZXNjcmlwdGlvbiI6Ildpa2lwZWRpYSBmb3IgV2ViIEFQSXMuIFJlcG9zaXRvcnkgb2YgQVBJIGRlZmluaXRpb25zIGluIE9wZW5BUEkgZm9ybWF0LlxuKipXYXJuaW5nKio6IElmIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIGFib3V0IGNoYW5nZXMgaW4gYWR2YW5jZSBwbGVhc2Ugam9pbiBvdXIgW1NsYWNrIGNoYW5uZWxdKGh0dHBzOi8vam9pbi5zbGFjay5jb20vdC9tZXJtYWRlL3NoYXJlZF9pbnZpdGUvenQtZzc4Zzd4aXItTUxFX0NUQ2NYQ2RmSmZHM0NKZTlxQSkuXG5DbGllbnQgc2FtcGxlOiBbW0RlbW9dXShodHRwczovL2FwaXMuZ3VydS9zaW1wbGUtdWkpIFtbUmVwb11dKGh0dHBzOi8vZ2l0aHViLmNvbS9BUElzLWd1cnUvc2ltcGxlLXVpKVxuIiwiY29udGFjdCI6eyJuYW1lIjoiQVBJcy5ndXJ1IiwidXJsIjoiaHR0cHM6Ly9BUElzLmd1cnUiLCJlbWFpbCI6Im1pa2UucmFscGhzb25AZ21haWwuY29tIn0sImxpY2Vuc2UiOnsibmFtZSI6IkNDMCAxLjAiLCJ1cmwiOiJodHRwczovL2dpdGh1Yi5jb20vQVBJcy1ndXJ1L29wZW5hcGktZGlyZWN0b3J5I2xpY2Vuc2VzIn0sIngtbG9nbyI6eyJ1cmwiOiJodHRwczovL2FwaXMuZ3VydS9icmFuZGluZy9sb2dvX3ZlcnRpY2FsLnN2ZyJ9fSwiZXh0ZXJuYWxEb2NzIjp7InVybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9BUElzLWd1cnUvb3BlbmFwaS1kaXJlY3RvcnkvYmxvYi9tYXN0ZXIvQVBJLm1kIn0sInNlcnZlcnMiOlt7InVybCI6Imh0dHBzOi8vYXBpLmFwaXMuZ3VydS92MiJ9XSwic2VjdXJpdHkiOltdLCJ0YWdzIjpbeyJuYW1lIjoiQVBJcyIsImRlc2NyaXB0aW9uIjoiQWN0aW9ucyByZWxhdGluZyB0byBBUElzIGluIHRoZSBjb2xsZWN0aW9uIn1dLCJwYXRocyI6eyIvcHJvdmlkZXJzLmpzb24iOnsiZ2V0Ijp7Im9wZXJhdGlvbklkIjoiZ2V0UHJvdmlkZXJzIiwidGFncyI6WyJBUElzIl0sInN1bW1hcnkiOiJMaXN0IGFsbCBwcm92aWRlcnMiLCJkZXNjcmlwdGlvbiI6Ikxpc3QgYWxsIHRoZSBwcm92aWRlcnMgaW4gdGhlIGRpcmVjdG9yeVxuIiwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyJ0eXBlIjoib2JqZWN0IiwicHJvcGVydGllcyI6eyJkYXRhIjp7InR5cGUiOiJhcnJheSIsIml0ZW1zIjp7InR5cGUiOiJzdHJpbmciLCJtaW5MZW5ndGgiOjF9LCJtaW5JdGVtcyI6MX19fX19fX19fSwiL3twcm92aWRlcn0uanNvbiI6eyJnZXQiOnsib3BlcmF0aW9uSWQiOiJnZXRQcm92aWRlciIsInRhZ3MiOlsiQVBJcyJdLCJzdW1tYXJ5IjoiTGlzdCBhbGwgQVBJcyBmb3IgYSBwYXJ0aWN1bGFyIHByb3ZpZGVyIiwiZGVzY3JpcHRpb24iOiJMaXN0IGFsbCBBUElzIGluIHRoZSBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBwcm92aWRlck5hbWVcblJldHVybnMgbGlua3MgdG8gdGhlIGluZGl2aWR1YWwgQVBJIGVudHJ5IGZvciBlYWNoIEFQSS5cbiIsInBhcmFtZXRlcnMiOlt7IiRyZWYiOiIjL2NvbXBvbmVudHMvcGFyYW1ldGVycy9wcm92aWRlciJ9XSwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyIkcmVmIjoiIy9jb21wb25lbnRzL3NjaGVtYXMvQVBJcyJ9fX19fX19LCIve3Byb3ZpZGVyfS9zZXJ2aWNlcy5qc29uIjp7ImdldCI6eyJvcGVyYXRpb25JZCI6ImdldFNlcnZpY2VzIiwidGFncyI6WyJBUElzIl0sInN1bW1hcnkiOiJMaXN0IGFsbCBzZXJ2aWNlTmFtZXMgZm9yIGEgcGFydGljdWxhciBwcm92aWRlciIsImRlc2NyaXB0aW9uIjoiTGlzdCBhbGwgc2VydmljZU5hbWVzIGluIHRoZSBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBwcm92aWRlck5hbWVcbiIsInBhcmFtZXRlcnMiOlt7IiRyZWYiOiIjL2NvbXBvbmVudHMvcGFyYW1ldGVycy9wcm92aWRlciJ9XSwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyJ0eXBlIjoib2JqZWN0IiwicHJvcGVydGllcyI6eyJkYXRhIjp7InR5cGUiOiJhcnJheSIsIml0ZW1zIjp7InR5cGUiOiJzdHJpbmciLCJtaW5MZW5ndGgiOjB9LCJtaW5JdGVtcyI6MX19fX19fX19fSwiL3NwZWNzL3twcm92aWRlcn0ve2FwaX0uanNvbiI6eyJnZXQiOnsib3BlcmF0aW9uSWQiOiJnZXRBUEkiLCJ0YWdzIjpbIkFQSXMiXSwic3VtbWFyeSI6IlJldHJpZXZlIG9uZSB2ZXJzaW9uIG9mIGEgcGFydGljdWxhciBBUEkiLCJkZXNjcmlwdGlvbiI6IlJldHVybnMgdGhlIEFQSSBlbnRyeSBmb3Igb25lIHNwZWNpZmljIHZlcnNpb24gb2YgYW4gQVBJIHdoZXJlIHRoZXJlIGlzIG5vIHNlcnZpY2VOYW1lLiIsInBhcmFtZXRlcnMiOlt7IiRyZWYiOiIjL2NvbXBvbmVudHMvcGFyYW1ldGVycy9wcm92aWRlciJ9LHsiJHJlZiI6IiMvY29tcG9uZW50cy9wYXJhbWV0ZXJzL2FwaSJ9XSwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyIkcmVmIjoiIy9jb21wb25lbnRzL3NjaGVtYXMvQVBJIn19fX19fX0sIi9zcGVjcy97cHJvdmlkZXJ9L3tzZXJ2aWNlfS97YXBpfS5qc29uIjp7ImdldCI6eyJvcGVyYXRpb25JZCI6ImdldFNlcnZpY2VBUEkiLCJ0YWdzIjpbIkFQSXMiXSwic3VtbWFyeSI6IlJldHJpZXZlIG9uZSB2ZXJzaW9uIG9mIGEgcGFydGljdWxhciBBUEkgd2l0aCBhIHNlcnZpY2VOYW1lLiIsImRlc2NyaXB0aW9uIjoiUmV0dXJucyB0aGUgQVBJIGVudHJ5IGZvciBvbmUgc3BlY2lmaWMgdmVyc2lvbiBvZiBhbiBBUEkgd2hlcmUgdGhlcmUgaXMgYSBzZXJ2aWNlTmFtZS4iLCJwYXJhbWV0ZXJzIjpbeyIkcmVmIjoiIy9jb21wb25lbnRzL3BhcmFtZXRlcnMvcHJvdmlkZXIifSx7Im5hbWUiOiJzZXJ2aWNlIiwiaW4iOiJwYXRoIiwicmVxdWlyZWQiOnRydWUsInNjaGVtYSI6eyJ0eXBlIjoic3RyaW5nIiwibWluTGVuZ3RoIjoxLCJtYXhMZW5ndGgiOjI1NSwiZXhhbXBsZSI6ImdyYXBoIn19LHsiJHJlZiI6IiMvY29tcG9uZW50cy9wYXJhbWV0ZXJzL2FwaSJ9XSwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyIkcmVmIjoiIy9jb21wb25lbnRzL3NjaGVtYXMvQVBJIn19fX19fX0sIi9saXN0Lmpzb24iOnsiZ2V0Ijp7Im9wZXJhdGlvbklkIjoibGlzdEFQSXMiLCJ0YWdzIjpbIkFQSXMiXSwic3VtbWFyeSI6Ikxpc3QgYWxsIEFQSXMiLCJkZXNjcmlwdGlvbiI6Ikxpc3QgYWxsIEFQSXMgaW4gdGhlIGRpcmVjdG9yeS5cblJldHVybnMgbGlua3MgdG8gdGhlIE9wZW5BUEkgZGVmaW5pdGlvbnMgZm9yIGVhY2ggQVBJIGluIHRoZSBkaXJlY3RvcnkuXG5JZiBBUEkgZXhpc3QgaW4gbXVsdGlwbGUgdmVyc2lvbnMgYHByZWZlcnJlZGAgb25lIGlzIGV4cGxpY2l0bHkgbWFya2VkLlxuU29tZSBiYXNpYyBpbmZvIGZyb20gdGhlIE9wZW5BUEkgZGVmaW5pdGlvbiBpcyBjYWNoZWQgaW5zaWRlIGVhY2ggb2JqZWN0LlxuVGhpcyBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIHNvbWUgc2ltcGxlIHZpZXdzIHdpdGhvdXQgbmVlZGluZyB0byBmZXRjaCB0aGUgT3BlbkFQSSBkZWZpbml0aW9uIGZvciBlYWNoIEFQSS5cbiIsInJlc3BvbnNlcyI6eyIyMDAiOnsiZGVzY3JpcHRpb24iOiJPSyIsImNvbnRlbnQiOnsiYXBwbGljYXRpb24vanNvbiI6eyJzY2hlbWEiOnsiJHJlZiI6IiMvY29tcG9uZW50cy9zY2hlbWFzL0FQSXMifX19fX19fSwiL21ldHJpY3MuanNvbiI6eyJnZXQiOnsib3BlcmF0aW9uSWQiOiJnZXRNZXRyaWNzIiwic3VtbWFyeSI6IkdldCBiYXNpYyBtZXRyaWNzIiwiZGVzY3JpcHRpb24iOiJTb21lIGJhc2ljIG1ldHJpY3MgZm9yIHRoZSBlbnRpcmUgZGlyZWN0b3J5LlxuSnVzdCBzdHVubmluZyBudW1iZXJzIHRvIHB1dCBvbiBhIGZyb250IHBhZ2UgYW5kIGFyZSBpbnRlbmRlZCBwdXJlbHkgZm9yIFdvVyBlZmZlY3QgOilcbiIsInRhZ3MiOlsiQVBJcyJdLCJyZXNwb25zZXMiOnsiMjAwIjp7ImRlc2NyaXB0aW9uIjoiT0siLCJjb250ZW50Ijp7ImFwcGxpY2F0aW9uL2pzb24iOnsic2NoZW1hIjp7IiRyZWYiOiIjL2NvbXBvbmVudHMvc2NoZW1hcy9NZXRyaWNzIn19fX19fX19LCJjb21wb25lbnRzIjp7InNjaGVtYXMiOnsiQVBJcyI6eyJkZXNjcmlwdGlvbiI6Ikxpc3Qgb2YgQVBJIGRldGFpbHMuXG5JdCBpcyBhIEpTT04gb2JqZWN0IHdpdGggQVBJIElEcyhgPHByb3ZpZGVyPls6PHNlcnZpY2U+XWApIGFzIGtleXMuXG4iLCJ0eXBlIjoib2JqZWN0IiwiYWRkaXRpb25hbFByb3BlcnRpZXMiOnsiJHJlZiI6IiMvY29tcG9uZW50cy9zY2hlbWFzL0FQSSJ9LCJtaW5Qcm9wZXJ0aWVzIjoxLCJleGFtcGxlIjp7Imdvb2dsZWFwaXMuY29tOmRyaXZlIjp7ImFkZGVkIjoiMjAxNS0wMi0yMlQyMDowMDo0NS4wMDBaIiwicHJlZmVycmVkIjoidjMiLCJ2ZXJzaW9ucyI6eyJ2MiI6eyJhZGRlZCI6IjIwMTUtMDItMjJUMjA6MDA6NDUuMDAwWiIsImluZm8iOnsidGl0bGUiOiJEcml2ZSIsInZlcnNpb24iOiJ2MiIsIngtYXBpQ2xpZW50UmVnaXN0cmF0aW9uIjp7InVybCI6Imh0dHBzOi8vY29uc29sZS5kZXZlbG9wZXJzLmdvb2dsZS5jb20ifSwieC1sb2dvIjp7InVybCI6Imh0dHBzOi8vYXBpLmFwaXMuZ3VydS92Mi9jYWNoZS9sb2dvL2h0dHBzX3d3dy5nc3RhdGljLmNvbV9pbWFnZXNfaWNvbnNfbWF0ZXJpYWxfcHJvZHVjdF8yeF9kcml2ZV8zMmRwLnBuZyJ9LCJ4LW9yaWdpbiI6eyJmb3JtYXQiOiJnb29nbGUiLCJ1cmwiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kaXNjb3ZlcnkvdjEvYXBpcy9kcml2ZS92Mi9yZXN0IiwidmVyc2lvbiI6InYxIn0sIngtcHJlZmVycmVkIjpmYWxzZSwieC1wcm92aWRlck5hbWUiOiJnb29nbGVhcGlzLmNvbSIsIngtc2VydmljZU5hbWUiOiJkcml2ZSJ9LCJzd2FnZ2VyVXJsIjoiaHR0cHM6Ly9hcGkuYXBpcy5ndXJ1L3YyL3NwZWNzL2dvb2dsZWFwaXMuY29tL2RyaXZlL3YyL3N3YWdnZXIuanNvbiIsInN3YWdnZXJZYW1sVXJsIjoiaHR0cHM6Ly9hcGkuYXBpcy5ndXJ1L3YyL3NwZWNzL2dvb2dsZWFwaXMuY29tL2RyaXZlL3YyL3N3YWdnZXIueWFtbCIsInVwZGF0ZWQiOiIyMDE2LTA2LTE3VDAwOjIxOjQ0LjAwMFoifSwidjMiOnsiYWRkZWQiOiIyMDE1LTEyLTEyVDAwOjI1OjEzLjAwMFoiLCJpbmZvIjp7InRpdGxlIjoiRHJpdmUiLCJ2ZXJzaW9uIjoidjMiLCJ4LWFwaUNsaWVudFJlZ2lzdHJhdGlvbiI6eyJ1cmwiOiJodHRwczovL2NvbnNvbGUuZGV2ZWxvcGVycy5nb29nbGUuY29tIn0sIngtbG9nbyI6eyJ1cmwiOiJodHRwczovL2FwaS5hcGlzLmd1cnUvdjIvY2FjaGUvbG9nby9odHRwc193d3cuZ3N0YXRpYy5jb21faW1hZ2VzX2ljb25zX21hdGVyaWFsX3Byb2R1Y3RfMnhfZHJpdmVfMzJkcC5wbmcifSwieC1vcmlnaW4iOnsiZm9ybWF0IjoiZ29vZ2xlIiwidXJsIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZGlzY292ZXJ5L3YxL2FwaXMvZHJpdmUvdjMvcmVzdCIsInZlcnNpb24iOiJ2MSJ9LCJ4LXByZWZlcnJlZCI6dHJ1ZSwieC1wcm92aWRlck5hbWUiOiJnb29nbGVhcGlzLmNvbSIsIngtc2VydmljZU5hbWUiOiJkcml2ZSJ9LCJzd2FnZ2VyVXJsIjoiaHR0cHM6Ly9hcGkuYXBpcy5ndXJ1L3YyL3NwZWNzL2dvb2dsZWFwaXMuY29tL2RyaXZlL3YzL3N3YWdnZXIuanNvbiIsInN3YWdnZXJZYW1sVXJsIjoiaHR0cHM6Ly9hcGkuYXBpcy5ndXJ1L3YyL3NwZWNzL2dvb2dsZWFwaXMuY29tL2RyaXZlL3YzL3N3YWdnZXIueWFtbCIsInVwZGF0ZWQiOiIyMDE2LTA2LTE3VDAwOjIxOjQ0LjAwMFoifX19fX0sIkFQSSI6eyJkZXNjcmlwdGlvbiI6Ik1ldGEgaW5mb3JtYXRpb24gYWJvdXQgQVBJIiwidHlwZSI6Im9iamVjdCIsInJlcXVpcmVkIjpbImFkZGVkIiwicHJlZmVycmVkIiwidmVyc2lvbnMiXSwicHJvcGVydGllcyI6eyJhZGRlZCI6eyJkZXNjcmlwdGlvbiI6IlRpbWVzdGFtcCB3aGVuIHRoZSBBUEkgd2FzIGZpcnN0IGFkZGVkIHRvIHRoZSBkaXJlY3RvcnkiLCJ0eXBlIjoic3RyaW5nIiwiZm9ybWF0IjoiZGF0ZS10aW1lIn0sInByZWZlcnJlZCI6eyJkZXNjcmlwdGlvbiI6IlJlY29tbWVuZGVkIHZlcnNpb24iLCJ0eXBlIjoic3RyaW5nIn0sInZlcnNpb25zIjp7ImRlc2NyaXB0aW9uIjoiTGlzdCBvZiBzdXBwb3J0ZWQgdmVyc2lvbnMgb2YgdGhlIEFQSSIsInR5cGUiOiJvYmplY3QiLCJhZGRpdGlvbmFsUHJvcGVydGllcyI6eyIkcmVmIjoiIy9jb21wb25lbnRzL3NjaGVtYXMvQXBpVmVyc2lvbiJ9LCJtaW5Qcm9wZXJ0aWVzIjoxfX0sImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjpmYWxzZX0sIkFwaVZlcnNpb24iOnsidHlwZSI6Im9iamVjdCIsInJlcXVpcmVkIjpbImFkZGVkIiwidXBkYXRlZCIsInN3YWdnZXJVcmwiLCJzd2FnZ2VyWWFtbFVybCIsImluZm8iLCJvcGVuYXBpVmVyIl0sInByb3BlcnRpZXMiOnsiYWRkZWQiOnsiZGVzY3JpcHRpb24iOiJUaW1lc3RhbXAgd2hlbiB0aGUgdmVyc2lvbiB3YXMgYWRkZWQiLCJ0eXBlIjoic3RyaW5nIiwiZm9ybWF0IjoiZGF0ZS10aW1lIn0sInVwZGF0ZWQiOnsiZGVzY3JpcHRpb24iOiJUaW1lc3RhbXAgd2hlbiB0aGUgdmVyc2lvbiB3YXMgdXBkYXRlZCIsInR5cGUiOiJzdHJpbmciLCJmb3JtYXQiOiJkYXRlLXRpbWUifSwic3dhZ2dlclVybCI6eyJkZXNjcmlwdGlvbiI6IlVSTCB0byBPcGVuQVBJIGRlZmluaXRpb24gaW4gSlNPTiBmb3JtYXQiLCJ0eXBlIjoic3RyaW5nIiwiZm9ybWF0IjoidXJsIn0sInN3YWdnZXJZYW1sVXJsIjp7ImRlc2NyaXB0aW9uIjoiVVJMIHRvIE9wZW5BUEkgZGVmaW5pdGlvbiBpbiBZQU1MIGZvcm1hdCIsInR5cGUiOiJzdHJpbmciLCJmb3JtYXQiOiJ1cmwifSwibGluayI6eyJkZXNjcmlwdGlvbiI6IkxpbmsgdG8gdGhlIGluZGl2aWR1YWwgQVBJIGVudHJ5IGZvciB0aGlzIEFQSSIsInR5cGUiOiJzdHJpbmciLCJmb3JtYXQiOiJ1cmwifSwiaW5mbyI6eyJkZXNjcmlwdGlvbiI6IkNvcHkgb2YgYGluZm9gIHNlY3Rpb24gZnJvbSBPcGVuQVBJIGRlZmluaXRpb24iLCJ0eXBlIjoib2JqZWN0IiwibWluUHJvcGVydGllcyI6MX0sImV4dGVybmFsRG9jcyI6eyJkZXNjcmlwdGlvbiI6IkNvcHkgb2YgYGV4dGVybmFsRG9jc2Agc2VjdGlvbiBmcm9tIE9wZW5BUEkgZGVmaW5pdGlvbiIsInR5cGUiOiJvYmplY3QiLCJtaW5Qcm9wZXJ0aWVzIjoxfSwib3BlbmFwaVZlciI6eyJkZXNjcmlwdGlvbiI6IlRoZSB2YWx1ZSBvZiB0aGUgYG9wZW5hcGlgIG9yIGBzd2FnZ2VyYCBwcm9wZXJ0eSBvZiB0aGUgc291cmNlIGRlZmluaXRpb24iLCJ0eXBlIjoic3RyaW5nIn19LCJhZGRpdGlvbmFsUHJvcGVydGllcyI6ZmFsc2V9LCJNZXRyaWNzIjp7ImRlc2NyaXB0aW9uIjoiTGlzdCBvZiBiYXNpYyBtZXRyaWNzIiwidHlwZSI6Im9iamVjdCIsInJlcXVpcmVkIjpbIm51bVNwZWNzIiwibnVtQVBJcyIsIm51bUVuZHBvaW50cyJdLCJwcm9wZXJ0aWVzIjp7Im51bVNwZWNzIjp7ImRlc2NyaXB0aW9uIjoiTnVtYmVyIG9mIEFQSSBkZWZpbml0aW9ucyBpbmNsdWRpbmcgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIEFQSSIsInR5cGUiOiJpbnRlZ2VyIiwibWluaW11bSI6MX0sIm51bUFQSXMiOnsiZGVzY3JpcHRpb24iOiJOdW1iZXIgb2YgdW5pcXVlIEFQSXMiLCJ0eXBlIjoiaW50ZWdlciIsIm1pbmltdW0iOjF9LCJudW1FbmRwb2ludHMiOnsiZGVzY3JpcHRpb24iOiJUb3RhbCBudW1iZXIgb2YgZW5kcG9pbnRzIGluc2lkZSBhbGwgZGVmaW5pdGlvbnMiLCJ0eXBlIjoiaW50ZWdlciIsIm1pbmltdW0iOjF9LCJ1bnJlYWNoYWJsZSI6eyJkZXNjcmlwdGlvbiI6Ik51bWJlciBvZiB1bnJlYWNoYWJsZSAoNFhYLDVYWCBzdGF0dXMpIEFQSXMiLCJ0eXBlIjoiaW50ZWdlciJ9LCJpbnZhbGlkIjp7ImRlc2NyaXB0aW9uIjoiTnVtYmVyIG9mIG5ld2x5IGludmFsaWQgQVBJcyIsInR5cGUiOiJpbnRlZ2VyIn0sInVub2ZmaWNpYWwiOnsiZGVzY3JpcHRpb24iOiJOdW1iZXIgb2YgdW5vZmZpY2lhbCBBUElzIiwidHlwZSI6ImludGVnZXIifSwiZml4ZXMiOnsiZGVzY3JpcHRpb24iOiJUb3RhbCBudW1iZXIgb2YgZml4ZXMgYXBwbGllZCBhY3Jvc3MgYWxsIEFQSXMiLCJ0eXBlIjoiaW50ZWdlciJ9LCJmaXhlZFBjdCI6eyJkZXNjcmlwdGlvbiI6IlBlcmNlbnRhZ2Ugb2YgYWxsIEFQSXMgd2hlcmUgYXV0byBmaXhlcyBoYXZlIGJlZW4gYXBwbGllZCIsInR5cGUiOiJpbnRlZ2VyIn0sImRhdGFzZXRzIjp7ImRlc2NyaXB0aW9uIjoiRGF0YSB1c2VkIGZvciBjaGFydGluZyBldGMiLCJ0eXBlIjoiYXJyYXkiLCJpdGVtcyI6e319LCJzdGFycyI6eyJkZXNjcmlwdGlvbiI6IkdpdEh1YiBzdGFycyBmb3Igb3VyIG1haW4gcmVwbyIsInR5cGUiOiJpbnRlZ2VyIn0sImlzc3VlcyI6eyJkZXNjcmlwdGlvbiI6Ik9wZW4gR2l0SHViIGlzc3VlcyBvbiBvdXIgbWFpbiByZXBvIiwidHlwZSI6ImludGVnZXIifSwidGhpc1dlZWsiOnsiZGVzY3JpcHRpb24iOiJTdW1tYXJ5IHRvdGFscyBmb3IgdGhlIGxhc3QgNyBkYXlzIiwidHlwZSI6Im9iamVjdCIsInByb3BlcnRpZXMiOnsiYWRkZWQiOnsiZGVzY3JpcHRpb24iOiJBUElzIGFkZGVkIGluIHRoZSBsYXN0IHdlZWsiLCJ0eXBlIjoiaW50ZWdlciJ9LCJ1cGRhdGVkIjp7ImRlc2NyaXB0aW9uIjoiQVBJcyB1cGRhdGVkIGluIHRoZSBsYXN0IHdlZWsiLCJ0eXBlIjoiaW50ZWdlciJ9fX0sIm51bURyaXZlcnMiOnsiZGVzY3JpcHRpb24iOiJOdW1iZXIgb2YgbWV0aG9kcyBvZiBBUEkgcmV0cmlldmFsIiwidHlwZSI6ImludGVnZXIifSwibnVtUHJvdmlkZXJzIjp7ImRlc2NyaXB0aW9uIjoiTnVtYmVyIG9mIEFQSSBwcm92aWRlcnMgaW4gZGlyZWN0b3J5IiwidHlwZSI6ImludGVnZXIifX0sImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjpmYWxzZSwiZXhhbXBsZSI6eyJudW1BUElzIjoyNTAxLCJudW1FbmRwb2ludHMiOjEwNjQ0OCwibnVtU3BlY3MiOjMzMjksInVucmVhY2hhYmxlIjoxMjMsImludmFsaWQiOjU5OCwidW5vZmZpY2lhbCI6MjUsImZpeGVzIjo4MTExOSwiZml4ZWRQY3QiOjIyLCJkYXRhc2V0cyI6W10sInN0YXJzIjoyNDI5LCJpc3N1ZXMiOjI4LCJ0aGlzV2VlayI6eyJhZGRlZCI6NDUsInVwZGF0ZWQiOjE3MX0sIm51bURyaXZlcnMiOjEwLCJudW1Qcm92aWRlcnMiOjY1OX19fSwicGFyYW1ldGVycyI6eyJwcm92aWRlciI6eyJuYW1lIjoicHJvdmlkZXIiLCJpbiI6InBhdGgiLCJyZXF1aXJlZCI6dHJ1ZSwic2NoZW1hIjp7InR5cGUiOiJzdHJpbmciLCJtaW5MZW5ndGgiOjEsIm1heExlbmd0aCI6MjU1LCJleGFtcGxlIjoiYXBpcy5ndXJ1In19LCJhcGkiOnsibmFtZSI6ImFwaSIsImluIjoicGF0aCIsInJlcXVpcmVkIjp0cnVlLCJzY2hlbWEiOnsidHlwZSI6InN0cmluZyIsIm1pbkxlbmd0aCI6MSwibWF4TGVuZ3RoIjoyNTUsImV4YW1wbGUiOiIyLjEuMCJ9fX19fQo=\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://api.apis.guru/v2/\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/apiguru-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"apigw_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/metrics.json\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"apigw_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"API Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -5972,7 +5791,7 @@ "response": [] }, { - "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + redocly + WAF", + "name": "APIGuru API Gateway RateLimit + JWT AuthN/AuthZ + redocly + moesif", "event": [ { "listen": "test", @@ -5985,7 +5804,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -5994,7 +5814,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked-bot-allowed.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"APIGuru\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/apiguru\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://api.apis.guru/v2/openapi.yaml\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://api.apis.guru/v2/\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/apiguru-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"apigw_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/metrics.json\"\n ]\n }\n ],\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"apigw_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"API Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -6015,33 +5835,549 @@ } }, "response": [] - }, + } + ] + }, + { + "name": "Petstore API", + "item": [ { - "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + redocly + WAF + syslog", - "event": [ + "name": "API Client test requests", + "item": [ { - "listen": "test", - "script": { - "exec": [ - "var respData = JSON.parse(responseBody);", - "", - "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", - "", - "pm.collectionVariables.set('configUid',respData.configUid);" - ], - "type": "text/javascript", - "packages": {} - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked-bot-allowed.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"syslog:server=192.168.2.13:514\"\n },\n \"error\": {\n \"destination\": \"syslog:server=192.168.2.13:514\"\n }\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", - "options": { - "raw": { + "name": "Get Inventory (legitimate request)", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/petstore/store/inventory", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "store", + "inventory" + ] + } + }, + "response": [] + }, + { + "name": "Get Inventory (malicious query string)", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/petstore/store/inventory?/etc/passwd", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "store", + "inventory" + ], + "query": [ + { + "key": "/etc/passwd", + "value": null + } + ] + } + }, + "response": [] + }, + { + "name": "Get Inventory (XSS attack)", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/petstore/store/inventory?", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "store", + "inventory" + ], + "query": [ + { + "key": "", + "value": null + } + ] + } + }, + "response": [] + }, + { + "name": "Login without token", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/petstore/user/login", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "user", + "login" + ] + } + }, + "response": [] + }, + { + "name": "Login with \"DevOps\" token", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/petstore/user/login", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "user", + "login" + ] + } + }, + "response": [] + }, + { + "name": "Login with \"Guest\" token", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDk3NjQ3NTMsImV4cCI6MTcwOTc2NDc1NH0.eyJuYW1lIjoiQWxpY2UgR3Vlc3QiLCJzdWIiOiJKV1Qgc3ViIGNsYWltIiwiaXNzIjoiSldUIGlzcyBjbGFpbSIsInJvbGVzIjpbImd1ZXN0Il19.jFJDq-33irz7uFxdI8c8fIb5TwTAU5BlemmIFVALUAE", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/petstore/user/login", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "user", + "login" + ] + } + }, + "response": [] + }, + { + "name": "Login with dual (DevOps & Guest) role token", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDk3NjQ3NTMsImV4cCI6MTcwOTc2NDc1NH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIiwiZ3Vlc3QiXX0.3ES7aVquklWqlZ4OWzt8rBz5px4kKZRgvifFVNomCsU", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/petstore/user/login", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "user", + "login" + ] + } + }, + "response": [] + }, + { + "name": "Upload pet image without token", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/octet-stream", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqChYRcchQXbSLijjWKhShQqgVWnUwuX5Ck4YkxcVRcC04+LFYdXBx1tXBVRAEP0CcHZwUXaTE/yWFFjEeHPfj3b3H3TtAaFSYanbFAFWzjFQiLmayq2LwFQEI6Mc4BmVm6nOSlITn+LqHj693UZ7lfe7P0ZvLmwzwicQxphsW8QbxzKalc94nDrOSnCM+J54w6ILEj1xXXH7jXHRY4JlhI52aJw4Ti8UOVjqYlQyVeJo4klM1yhcyLuc4b3FWKzXWuid/YSivrSxzneYIEljEEiSIUFBDGRVYiNKqkWIiRftxD/+w45fIpZCrDEaOBVShQnb84H/wu1uzMDXpJoXiQODFtj9GgeAu0Kzb9vexbTdPAP8zcKW1/dUGMPtJer2tRY6Avm3g4rqtKXvA5Q4w9KTLhuxIfppCoQC8n9E3ZYGBW6Bnze2ttY/TByBNXSVvgINDYKxI2ese7+7u7O3fM63+fgB5bXKpzZcBIwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFAhArKAvJglcAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC" + }, + "url": { + "raw": "https://apigw.nginx.lab/petstore/pet/1/uploadImage", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "pet", + "1", + "uploadImage" + ] + } + }, + "response": [] + }, + { + "name": "Upload pet image with \"DevOps\" token", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/octet-stream", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqChYRcchQXbSLijjWKhShQqgVWnUwuX5Ck4YkxcVRcC04+LFYdXBx1tXBVRAEP0CcHZwUXaTE/yWFFjEeHPfj3b3H3TtAaFSYanbFAFWzjFQiLmayq2LwFQEI6Mc4BmVm6nOSlITn+LqHj693UZ7lfe7P0ZvLmwzwicQxphsW8QbxzKalc94nDrOSnCM+J54w6ILEj1xXXH7jXHRY4JlhI52aJw4Ti8UOVjqYlQyVeJo4klM1yhcyLuc4b3FWKzXWuid/YSivrSxzneYIEljEEiSIUFBDGRVYiNKqkWIiRftxD/+w45fIpZCrDEaOBVShQnb84H/wu1uzMDXpJoXiQODFtj9GgeAu0Kzb9vexbTdPAP8zcKW1/dUGMPtJer2tRY6Avm3g4rqtKXvA5Q4w9KTLhuxIfppCoQC8n9E3ZYGBW6Bnze2ttY/TByBNXSVvgINDYKxI2ese7+7u7O3fM63+fgB5bXKpzZcBIwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFAhArKAvJglcAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC" + }, + "url": { + "raw": "https://apigw.nginx.lab/petstore/pet/1/uploadImage", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "pet", + "1", + "uploadImage" + ] + } + }, + "response": [] + }, + { + "name": "Upload pet image with \"Guest\" token", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDk3NjQ3NTMsImV4cCI6MTcwOTc2NDc1NH0.eyJuYW1lIjoiQWxpY2UgR3Vlc3QiLCJzdWIiOiJKV1Qgc3ViIGNsYWltIiwiaXNzIjoiSldUIGlzcyBjbGFpbSIsInJvbGVzIjpbImd1ZXN0Il19.jFJDq-33irz7uFxdI8c8fIb5TwTAU5BlemmIFVALUAE", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "file", + "value": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqChYRcchQXbSLijjWKhShQqgVWnUwuX5Ck4YkxcVRcC04+LFYdXBx1tXBVRAEP0CcHZwUXaTE/yWFFjEeHPfj3b3H3TtAaFSYanbFAFWzjFQiLmayq2LwFQEI6Mc4BmVm6nOSlITn+LqHj693UZ7lfe7P0ZvLmwzwicQxphsW8QbxzKalc94nDrOSnCM+J54w6ILEj1xXXH7jXHRY4JlhI52aJw4Ti8UOVjqYlQyVeJo4klM1yhcyLuc4b3FWKzXWuid/YSivrSxzneYIEljEEiSIUFBDGRVYiNKqkWIiRftxD/+w45fIpZCrDEaOBVShQnb84H/wu1uzMDXpJoXiQODFtj9GgeAu0Kzb9vexbTdPAP8zcKW1/dUGMPtJer2tRY6Avm3g4rqtKXvA5Q4w9KTLhuxIfppCoQC8n9E3ZYGBW6Bnze2ttY/TByBNXSVvgINDYKxI2ese7+7u7O3fM63+fgB5bXKpzZcBIwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFAhArKAvJglcAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC", + "type": "text" + }, + { + "key": "type", + "value": "image/png", + "type": "text" + } + ] + }, + "url": { + "raw": "https://apigw.nginx.lab/petstore/pet/1/uploadImage", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "petstore", + "pet", + "1", + "uploadImage" + ] + } + }, + "response": [] + } + ], + "description": "This folder contains requests to access the Petstore API published through NGINX using the Declarative API" + }, + { + "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + redocly", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config" + ] + } + }, + "response": [] + }, + { + "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + backstage", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config" + ] + } + }, + "response": [] + }, + { + "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + redocly + moesif", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config" + ] + } + }, + "response": [] + }, + { + "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + redocly + WAF", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked-bot-allowed.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config" + ] + } + }, + "response": [] + }, + { + "name": "Petstore 3 API Gateway RateLimit + JWT AuthN/AuthZ + redocly + WAF + syslog", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"syslog:server=192.168.2.13:514\"\n },\n \"error\": {\n \"destination\": \"syslog:server=192.168.2.13:514\"\n }\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked-bot-allowed.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", + "options": { + "raw": { "language": "json" } } @@ -6075,7 +6411,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -6084,7 +6421,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\",\n \"ngx_http_app_protect_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked-bot-allowed.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"cache\": {\n \"profile\": \"10m cache\",\n \"key\": \"$uri\",\n \"validity\": [\n {\n \"code\": \"200\",\n \"ttl\": \"5s\"\n }\n ]\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"cache\": [\n {\n \"profile\": \"10m cache\",\n \"key\": \"$http_method$uri\",\n \"validity\": [\n {\n \"code\": \"any\",\n \"ttl\": \"30s\"\n },\n {\n \"code\": \"302\",\n \"ttl\": \"5m\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/store/inventory\"\n ]\n }\n ]\n },\n \"cache\": {\n \"profile\": \"10m cache\",\n \"key\": \"$http_method$uri\",\n \"validity\": [\n {\n \"code\": \"any\",\n \"ttl\": \"30s\"\n },\n {\n \"code\": \"302\",\n \"ttl\": \"5m\"\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"cache\": [\n {\n \"name\": \"10m cache\",\n \"basepath\": \"/tmp\",\n \"size\": \"10m\",\n \"ttl\": \"10m\"\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\",\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"cache\": {\n \"profile\": \"10m cache\",\n \"key\": \"$uri\",\n \"validity\": [\n {\n \"code\": \"200\",\n \"ttl\": \"5s\"\n }\n ]\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"cache\": [\n {\n \"profile\": \"10m cache\",\n \"key\": \"$http_method$uri\",\n \"validity\": [\n {\n \"code\": \"any\",\n \"ttl\": \"30s\"\n },\n {\n \"code\": \"302\",\n \"ttl\": \"5m\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/store/inventory\"\n ]\n }\n ]\n },\n \"cache\": {\n \"profile\": \"10m cache\",\n \"key\": \"$http_method$uri\",\n \"validity\": [\n {\n \"code\": \"any\",\n \"ttl\": \"30s\"\n },\n {\n \"code\": \"302\",\n \"ttl\": \"5m\"\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"cache\": [\n {\n \"name\": \"10m cache\",\n \"basepath\": \"/tmp\",\n \"size\": \"10m\",\n \"ttl\": \"10m\"\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked-bot-allowed.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -6438,7 +6775,7 @@ "response": [] }, { - "name": "5. Get declaration Copy", + "name": "5. Get declaration", "event": [ { "listen": "test", @@ -6897,10 +7234,10 @@ ] }, { - "name": "GitOps autosync", + "name": "F5 WAF for NGINX", "item": [ { - "name": "NGINX Plus and GitOps", + "name": "Create initial NGINX configuration with F5 WAF for NGINX", "event": [ { "listen": "test", @@ -6913,7 +7250,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -6922,7 +7260,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 5,\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ],\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -6945,7 +7283,7 @@ "response": [] }, { - "name": "NGINX App Protect WAF and GitOps", + "name": "Change active F5 WAF for NGINX policy", "event": [ { "listen": "test", @@ -6958,16 +7296,17 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], "request": { - "method": "POST", + "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 5,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"gitops\",\n \"versions\": [\n {\n \"tag\": \"gitops\",\n \"displayName\": \"Production Policy - GitOps\",\n \"description\": \"This is a production-ready policy - Managed by GitOps\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-gitops.json\"\n }\n }\n ]\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ],\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-allowed\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"Production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"Production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n }\n }\n}", "options": { "raw": { "language": "json" @@ -6975,7 +7314,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", "protocol": "http", "host": [ "{{ncg_host}}" @@ -6983,34 +7322,38 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config" + "config", + "{{configUid}}" ] } }, "response": [] }, { - "name": "Get declaration status", + "name": "Update TLS certificates", "event": [ { "listen": "test", "script": { "exec": [ - "" + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {}, + "requests": {} } } ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, "request": { - "method": "GET", + "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert2.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert2.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7018,7 +7361,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}/status", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7027,35 +7370,36 @@ "path": [ "{{ngc_api_version}}", "config", - "{{configUid}}", - "status" + "{{configUid}}" ] } }, "response": [] }, { - "name": "Get declaration", + "name": "Disable F5 WAF for NGINX", "event": [ { "listen": "test", "script": { "exec": [ - "" + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } } ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, "request": { - "method": "GET", + "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ]\n }\n }\n}", "options": { "raw": { "language": "json" @@ -7077,26 +7421,37 @@ } }, "response": [] - }, + } + ] + }, + { + "name": "GitOps autosync", + "item": [ { - "name": "Delete declaration", + "name": "NGINX Plus and GitOps", "event": [ { "listen": "test", "script": { "exec": [ - "" + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {}, + "requests": {} } } ], "request": { - "method": "DELETE", + "method": "POST", "header": [], "body": { "mode": "raw", - "raw": "", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 5\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7104,7 +7459,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7112,20 +7467,14 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config", - "{{configUid}}" + "config" ] } }, "response": [] - } - ] - }, - { - "name": "Housekeeping - common endpoints", - "item": [ + }, { - "name": "Clean NGINX configuration", + "name": "F5 WAF for NGINX and GitOps", "event": [ { "listen": "test", @@ -7138,7 +7487,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -7147,7 +7497,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\"\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 5,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ],\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"gitops\",\n \"versions\": [\n {\n \"tag\": \"gitops\",\n \"displayName\": \"Production Policy - GitOps\",\n \"description\": \"This is a production-ready policy - Managed by GitOps\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-gitops.json\"\n }\n }\n ]\n }\n ]\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7215,7 +7565,7 @@ "response": [] }, { - "name": "Delete declaration", + "name": "Get declaration", "event": [ { "listen": "test", @@ -7227,8 +7577,11 @@ } } ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, "request": { - "method": "DELETE", + "method": "GET", "header": [], "body": { "mode": "raw", @@ -7256,7 +7609,7 @@ "response": [] }, { - "name": "Get declaration", + "name": "Delete declaration", "event": [ { "listen": "test", @@ -7268,11 +7621,8 @@ } } ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, "request": { - "method": "GET", + "method": "DELETE", "header": [], "body": { "mode": "raw", @@ -7302,10 +7652,10 @@ ] }, { - "name": "HTTP Headers Manipulation", + "name": "Housekeeping - common endpoints", "item": [ { - "name": "Create test echo service", + "name": "Clean NGINX configuration", "event": [ { "listen": "test", @@ -7327,7 +7677,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test echo app\",\n \"names\": [\n \"echo.vm-test.ie.ff.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test-echo-upstream\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test-echo-upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ],\n \"resolver\": \"Google\"\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\"\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n }\n}", "options": { "raw": { "language": "json" @@ -7350,29 +7700,27 @@ "response": [] }, { - "name": "Manipulate headers - server level", + "name": "Get declaration status", "event": [ { "listen": "test", "script": { "exec": [ - "var respData = JSON.parse(responseBody);", - "", - "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", - "", - "pm.collectionVariables.set('configUid',respData.configUid);" + "" ], - "type": "text/javascript", - "packages": {} + "type": "text/javascript" } } ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, "request": { - "method": "PATCH", + "method": "GET", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test echo app\",\n \"names\": [\n \"echo.vm-test.ie.ff.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"X-Injected-Client-IP\",\n \"value\": \"$remote_addr\"\n },\n {\n \"name\": \"X-Injected-Echo-Test-Version\",\n \"value\": \"v1\"\n },\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ],\n \"delete\": [\n \"User-Agent\"\n ]\n },\n \"to_client\": {\n \"add\": [\n {\n \"name\": \"X-Injected-Response-Status\",\n \"value\": \"$status\"\n }\n ],\n \"delete\": [\n \"vary\"\n ],\n \"replace\": [\n {\n \"name\": \"Server\",\n \"value\": \"Echo Test Server\"\n }\n ]\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test-echo-upstream\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test-echo-upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ],\n \"resolver\": \"Google\"\n }\n ]\n }\n }\n}", + "raw": "", "options": { "raw": { "language": "json" @@ -7380,7 +7728,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}/status", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7389,36 +7737,32 @@ "path": [ "{{ngc_api_version}}", "config", - "{{configUid}}" + "{{configUid}}", + "status" ] } }, "response": [] }, { - "name": "Manipulate headers - location level", + "name": "Delete declaration", "event": [ { "listen": "test", "script": { "exec": [ - "var respData = JSON.parse(responseBody);", - "", - "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", - "", - "pm.collectionVariables.set('configUid',respData.configUid);" + "" ], - "type": "text/javascript", - "packages": {} + "type": "text/javascript" } } ], "request": { - "method": "PATCH", + "method": "DELETE", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test echo app\",\n \"names\": [\n \"echo.vm-test.ie.ff.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test-echo-upstream\",\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"X-Injected-Client-IP\",\n \"value\": \"$remote_addr\"\n },\n {\n \"name\": \"X-Injected-Echo-Test-Version\",\n \"value\": \"v1\"\n },\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ],\n \"delete\": [\n \"User-Agent\"\n ]\n },\n \"to_client\": {\n \"add\": [\n {\n \"name\": \"X-Injected-Response-Status\",\n \"value\": \"$status\"\n }\n ],\n \"delete\": [\n \"vary\"\n ],\n \"replace\": [\n {\n \"name\": \"Server\",\n \"value\": \"Echo Test Server\"\n }\n ]\n }\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test-echo-upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ],\n \"resolver\": \"Google\"\n }\n ]\n }\n }\n}", + "raw": "", "options": { "raw": { "language": "json" @@ -7440,37 +7784,29 @@ } }, "response": [] - } - ], - "description": "Test using:\n\n`curl -i echo.vm-test.ie.ff.lan`\n\nThe actual FQDN can be modified in the request JSON body" - }, - { - "name": "HTTPS server", - "item": [ + }, { - "name": "TLS Offload", + "name": "Get declaration", "event": [ { "listen": "test", "script": { "exec": [ - "var respData = JSON.parse(responseBody);", - "", - "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", - "", - "pm.collectionVariables.set('configUid',respData.configUid);" + "" ], - "type": "text/javascript", - "packages": {} + "type": "text/javascript" } } ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, "request": { - "method": "POST", + "method": "GET", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n }\n }\n}", + "raw": "", "options": { "raw": { "language": "json" @@ -7478,7 +7814,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7486,14 +7822,20 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config" + "config", + "{{configUid}}" ] } }, "response": [] - }, + } + ] + }, + { + "name": "HTTP Headers Manipulation", + "item": [ { - "name": "TLS Offload and F5 WAF for NGINX", + "name": "Create test echo service", "event": [ { "listen": "test", @@ -7515,7 +7857,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - GitOps\",\n \"description\": \"This is a production-ready policy - Managed by GitOps\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked.json\"\n }\n }\n ]\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ],\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test echo app\",\n \"names\": [\n \"echo.vm-test.ie.ff.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test-echo-upstream\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test-echo-upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ],\n \"resolver\": \"Google\"\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7536,14 +7878,9 @@ } }, "response": [] - } - ] - }, - { - "name": "JWT Client Authentication", - "item": [ + }, { - "name": "JWT Client Authentication - local JWT key and Bearer token", + "name": "Manipulate headers - server level", "event": [ { "listen": "test", @@ -7561,11 +7898,11 @@ } ], "request": { - "method": "POST", + "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test service\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Auth with hardwired key and Bearer token\"\n }\n ]\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test_upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Auth with hardwired key and Bearer token\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\"\n }\n },\n {\n \"name\": \"JWT Auth with external key and Bearer token\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Authentication GitOps\",\n \"key\": \"http://192.168.2.5:20080/jwks.json\",\n \"cachetime\": 5\n }\n },\n {\n \"name\": \"JWT Auth with hardwired key and token in auth_token query string parameter\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"token_location\": \"$arg_auth_token\"\n }\n },\n {\n \"name\": \"JWT Auth with hardwired key and token in X-Auth-Token HTTP header\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"token_location\": \"$http_x_auth_token\"\n }\n }\n ]\n },\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test echo app\",\n \"names\": [\n \"echo.vm-test.ie.ff.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"X-Injected-Client-IP\",\n \"value\": \"$remote_addr\"\n },\n {\n \"name\": \"X-Injected-Echo-Test-Version\",\n \"value\": \"v1\"\n },\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ],\n \"delete\": [\n \"User-Agent\"\n ]\n },\n \"to_client\": {\n \"add\": [\n {\n \"name\": \"X-Injected-Response-Status\",\n \"value\": \"$status\"\n }\n ],\n \"delete\": [\n \"vary\"\n ],\n \"replace\": [\n {\n \"name\": \"Server\",\n \"value\": \"Echo Test Server\"\n }\n ]\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test-echo-upstream\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test-echo-upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ],\n \"resolver\": \"Google\"\n }\n ]\n }\n }\n}", "options": { "raw": { "language": "json" @@ -7573,7 +7910,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7581,14 +7918,15 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config" + "config", + "{{configUid}}" ] } }, "response": [] }, { - "name": "JWT secret fetched from URL", + "name": "Manipulate headers - location level", "event": [ { "listen": "test", @@ -7610,7 +7948,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test service\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Auth with external key and Bearer token\"\n }\n ]\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n }\n }\n ]\n }\n ]\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test echo app\",\n \"names\": [\n \"echo.vm-test.ie.ff.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test-echo-upstream\",\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"X-Injected-Client-IP\",\n \"value\": \"$remote_addr\"\n },\n {\n \"name\": \"X-Injected-Echo-Test-Version\",\n \"value\": \"v1\"\n },\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ],\n \"delete\": [\n \"User-Agent\"\n ]\n },\n \"to_client\": {\n \"add\": [\n {\n \"name\": \"X-Injected-Response-Status\",\n \"value\": \"$status\"\n }\n ],\n \"delete\": [\n \"vary\"\n ],\n \"replace\": [\n {\n \"name\": \"Server\",\n \"value\": \"Echo Test Server\"\n }\n ]\n }\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test-echo-upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ],\n \"resolver\": \"Google\"\n }\n ]\n }\n }\n}", "options": { "raw": { "language": "json" @@ -7632,9 +7970,15 @@ } }, "response": [] - }, + } + ], + "description": "Test using:\n\n`curl -i echo.vm-test.ie.ff.lan`\n\nThe actual FQDN can be modified in the request JSON body" + }, + { + "name": "HTTPS server", + "item": [ { - "name": "JWT token in auth_token query string parameter", + "name": "TLS Offload", "event": [ { "listen": "test", @@ -7647,16 +7991,17 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], "request": { - "method": "PATCH", + "method": "POST", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test service\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Auth with hardwired key and token in auth_token query string parameter\"\n }\n ]\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n }\n }\n ]\n }\n ]\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7664,7 +8009,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7672,15 +8017,14 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config", - "{{configUid}}" + "config" ] } }, "response": [] }, { - "name": "JWT token in HTTP X-Auth-Token header", + "name": "TLS Offload and F5 WAF for NGINX", "event": [ { "listen": "test", @@ -7693,16 +8037,17 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], "request": { - "method": "PATCH", + "method": "POST", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test service\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Auth with hardwired key and token in X-Auth-Token HTTP header\"\n }\n ]\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n }\n }\n ]\n }\n ]\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ],\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - GitOps\",\n \"description\": \"This is a production-ready policy - Managed by GitOps\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked.json\"\n }\n }\n ]\n }\n ]\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7710,7 +8055,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7718,8 +8063,7 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config", - "{{configUid}}" + "config" ] } }, @@ -7728,10 +8072,10 @@ ] }, { - "name": "JWT Client Authentication and Authorization", + "name": "JWT Client Authentication", "item": [ { - "name": "JWT Client Authentication and Authorization", + "name": "JWT Client Authentication - local JWT key and Bearer token", "event": [ { "listen": "test", @@ -7753,7 +8097,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"JWT AuthN and AuthZ test server\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"headers\": {\n \"to_client\": {\n \"add\": [\n {\n \"name\": \"X-Injected-JWT-Group\",\n \"value\": \"$jwt_claim_roles\"\n }\n ]\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"jwt_authentication_local\"\n }\n ]\n },\n \"authorization\": {\n \"profile\": \"jwt role based authorization\"\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test_upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"jwt_authentication_local\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Client Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"jwt_type\": \"signed\"\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"jwt role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ]\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test service\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Auth with hardwired key and Bearer token\"\n }\n ]\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test_upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Auth with hardwired key and Bearer token\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\"\n }\n },\n {\n \"name\": \"JWT Auth with external key and Bearer token\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Authentication GitOps\",\n \"key\": \"http://192.168.2.5:20080/jwks.json\",\n \"cachetime\": 5\n }\n },\n {\n \"name\": \"JWT Auth with hardwired key and token in auth_token query string parameter\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"token_location\": \"$arg_auth_token\"\n }\n },\n {\n \"name\": \"JWT Auth with hardwired key and token in X-Auth-Token HTTP header\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"token_location\": \"$http_x_auth_token\"\n }\n }\n ]\n },\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7774,14 +8118,9 @@ } }, "response": [] - } - ] - }, - { - "name": "mTLS Client Authentication", - "item": [ + }, { - "name": "HTTPS server with mTLS, OCSP, SSL Stapling", + "name": "JWT secret fetched from URL", "event": [ { "listen": "test", @@ -7799,11 +8138,11 @@ } ], "request": { - "method": "POST", + "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"server_cert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdSRENDQkN5Z0F3SUJBZ0lVTTNJQVZIRmxhSTVsY1d0TjZxOUVhcnlka0w4d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TVRBd01qTTVXaGNOCk1qUXdOakEzTVRBd01qTTVXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMRFQ2bnZleVZlNi9VZlk2aUtHVC9oV1A0cktDSGR0ClloZWU3RGVZR29QWGhGVjB6a3grVWExanBEZ21WUE1kVEJBdnoxODg5NzlEcHBqdmNYeFhsRmpnaUhjWDhpWVgKSXovSUVMc3dKRUNITWNsNkxmelA5eDVUY1gxTEdFblFOTWhHRzA2MjlxU2NCQmQyUUNiWlY0UWE1TkxlQnQ4cQpHQ2lXY3JiQnR3YlpiSGo1dk9aenJrdHBtRFBGS1V4bXR5b2dBQnNaTllnL0F3Y1l2RXdBOEQ0QTN0VEgxcGhvCkdYY3ZvZWpJelhRMUdmYys5azR3OFhHYWFQOGd2bTdOMXN2MnU2Yld4SHRGZHpWQk9udzJyaHUvWGYyY0N0dW4KUnIxSENKQXRRSDlkbDhzZks1czBSRlVuTlVYbFBiNTFBTjBjVFVGbEYrZlVUVmVON3dNMTdmeVZVY3IydTltSwo0UGdoWjkvMml0ZUpZV3hjK3k4V2NEQzBUV3hwZ2paVEw5Tk1GK2t6SXV2TjJOWFFybjcvSU5UQTMvNFlmWGRPCloxelpTdTlkclRMcG5DZHRpOWxuRHBKODd3bW41cVZSTlZiTlZRbldEeW5yZnoyTU1DY21jLzcvdkJFN2dDemQKNFJLWHJLdHloenlQSitycmh3NmpxYVA4QytaZGRvKzkvak9QVDFTSnUxZ21VbzFuZ2hBMWh2N0M5RUYrM2xQVApYSk5WV3dtYkdWK0p4cUdKSjJSa2toMlIrZTVIREdRY2hGWjJIcXBGTGVQN0trTHJBR2RkZFZQWEZhQ0RiU0R6ClJQd0I5WFlhakg5Zm5QWEtFT3ZpVEJhQVNjWUZwTXB5cm02UkxHUGRSVnE2RUNYVlB4MDdHdGFCaEVvVWIwK2YKVkZnNExtQkx4MldQQWdNQkFBR2pnZ0VpTUlJQkhqQUpCZ05WSFJNRUFqQUFNQkVHQ1dDR1NBR0crRUlCQVFRRQpBd0lHUURBekJnbGdoa2dCaHZoQ0FRMEVKaFlrVDNCbGJsTlRUQ0JIWlc1bGNtRjBaV1FnVTJWeWRtVnlJRU5sCmNuUnBabWxqWVhSbE1CMEdBMVVkRGdRV0JCVHZFZWJGK1JDV0JhcGVPWUdpQ0YyVHZxbExYekNCaEFZRFZSMGoKQkgwd2U0QVVFdW9Db3kvcmhMQmxzcm5KdXE2QzFJczQxbFNoVGFSTE1Fa3hDekFKQmdOVkJBWVRBa2xVTVEwdwpDd1lEVlFRSURBUkJjM1JwTVJFd0R3WURWUVFLREFoVVpYTjBJRXhoWWpFWU1CWUdBMVVFQXd3UGRtMHRZbXhoCmJtc3VabVl1YkdGdWdoUld4QjhCa3lmK1RkQXc2Q3dPZE1aT0k0NlZ2REFPQmdOVkhROEJBZjhFQkFNQ0JhQXcKRXdZRFZSMGxCQXd3Q2dZSUt3WUJCUVVIQXdFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFHUDR6ZkdseTI1RwpneTBSeC9SSTNpNzJDVlIrSXY3SW5WTUVGWDZqRHRNV3hSblFtRGZsMWtTOVF1Y3hNb0tnOE9URStMcnlzdGJsClF4WGZiakZQekNoNHB1UGtGTmNBeG1mVmR4b20xR1lodWpoYTBQOUswUURZSDZycGlUaFdSQ2greUovQm1qZ2wKTlJabks4WGRqME85Ui9XKzJrTFRac2VFbS9hZHFVQ3dkYzNBWWlNWGh4QXkvQlh3bFRQeDMyMHZCcXYxZGFyVgp5ZlVoRlM1Rkg3enV2bGtGQ1p6M3lpOGYvYXMwbkRTUkFrY3dPRFQvN1diQlN4QTk3ZzJmRk1EMEI3WlUvbndGCmU4VnRzNDl3YmZ6QWJRMk40RUc2OEVhODE1VlFRM2N6YWthdjBCdkxHL2UwT0habGxYcUVhV1ZlWFJtSWFFOHcKWko5OEhUaDJMbUlFV2Jpdm94Kyt2UXd3bVhKTm1DRFVXNnVmcHdBOVdKQ0VhYmhxeXdGVzh1dFVENzRTVXE3SApEUDhNamtJZ0o3ekl2Tkd1RkFsSzd6c2xpV2pzeUN1OGVNamhvN2pVRFhGR1R0R0ZMUGtVa08vSysrSGVVRFg0Cm1OWDJ2aHI3NGRqRkNBTTEvOTYxWnB5NUFYUzZkd2g3MFlJL2dMdldSL0J1ejBnNEp6YUI2UFo4M1ErYm9QVHYKM1ZIS2xOWjlKQlhRTmtSc3N6U0dYWG5MYmtOTmNwVFg2cnAyZ1pUSS9NNDhGTnBxanAxOXRpQVg3bWN0cTl2SgpNejhvemhEcHZmSTlnMjFsNFZlRGdpbWEwTDVBc1pQbFdIQlZjcy9yL3dMU2YzWFVYZEs0UHpCQUdIRFBidXYrCnpKOVNqS0NFVll2bHRhMHlUUVBCSFJPa2Y2MG1sVmh6Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"server_key\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBc05QcWU5N0pWN3I5UjlqcUlvWlArRlkvaXNvSWQyMWlGNTdzTjVnYWc5ZUVWWFRPClRINVJyV09rT0NaVTh4MU1FQy9QWHp6M3YwT21tTzl4ZkZlVVdPQ0lkeGZ5SmhjalA4Z1F1ekFrUUljeHlYb3QKL00vM0hsTnhmVXNZU2RBMHlFWWJUcmIycEp3RUYzWkFKdGxYaEJyazB0NEczeW9ZS0paeXRzRzNCdGxzZVBtOAo1bk91UzJtWU04VXBUR2EzS2lBQUd4azFpRDhEQnhpOFRBRHdQZ0RlMU1mV21HZ1pkeStoNk1qTmREVVo5ejcyClRqRHhjWnBvL3lDK2JzM1d5L2E3cHRiRWUwVjNOVUU2ZkRhdUc3OWQvWndLMjZkR3ZVY0lrQzFBZjEyWHl4OHIKbXpSRVZTYzFSZVU5dm5VQTNSeE5RV1VYNTlSTlY0M3ZBelh0L0pWUnl2YTcyWXJnK0NGbjMvYUsxNGxoYkZ6NwpMeFp3TUxSTmJHbUNObE12MDB3WDZUTWk2ODNZMWRDdWZ2OGcxTURmL2hoOWQwNW5YTmxLNzEydE11bWNKMjJMCjJXY09rbnp2Q2FmbXBWRTFWczFWQ2RZUEtldC9QWXd3Snlaei92KzhFVHVBTE4zaEVwZXNxM0tIUEk4bjZ1dUgKRHFPcG8vd0w1bDEyajczK000OVBWSW03V0NaU2pXZUNFRFdHL3NMMFFYN2VVOU5jazFWYkNac1pYNG5Hb1lrbgpaR1NTSFpINTdrY01aQnlFVm5ZZXFrVXQ0L3NxUXVzQVoxMTFVOWNWb0lOdElQTkUvQUgxZGhxTWYxK2M5Y29RCjYrSk1Gb0JKeGdXa3luS3VicEVzWTkxRldyb1FKZFUvSFRzYTFvR0VTaFJ2VDU5VVdEZ3VZRXZIWlk4Q0F3RUEKQVFLQ0FnQVBUR1pQRFRsU004VlIvL3hSdkZrUzNUTm1LSkNPOUpHMkJYUGVZM1IzejUrTlhTdTBCb0craEk1aQpwVDVZUWtLZ2ErSi9GT0ZDVlBJRzdVQmVSNTE0Q3dVRGVMamtmci8zOXJFcjRNQmlMTkFyNUR3eVVUUEtGZUlOCnV2K0E4MWg5czBNTmpsck1ad3NibElsOFV2VjFZblpGb0J2c0Z0SThRTGZ3QTlaMzZ6dXRRNzRLR2h3TVBqaUMKMGgzK2xDeG9vcGdmd0JDWGx3d0dBeWZYVTRWMWQ5SFBpdktRQVFHakJDWDM0OWVTcEQxNDNLT21wQ2xmY01LQQp3QzU1bTZsbndCTUFIamlsaVo4RXBuNE8zUlEzSmxsVlpiaXl4RWdrZkE3TG1uNm9Ca3Jwc2VxdDVObThuRVhKCnBFbXhQcUl5Znc1WUNBMEhhNkM5WUhRN1RPRW9BbHBmWld4azAxSnpoVi9aK3FmVHM1YlMwQWNaTzFOVDRaeDgKWlF2eHQ0TDJINVcrK2R6RjhReTlidzQ2M3lKb1dydWxtNy9uQ3YvL1FpNGl0eHRnYyt0N2lwVXZzaUdTVktVWQpPelhCSXNWTUlnd0F6eUtTSEhPL21rMkEwVkgxaHB3emY2L0RzR2wxSjM4TU9pVGo4dEx1RWt3cFY4WGh5MnZwCkd0cXpsT21DS1hodlVDam9iZWlYSWJwSlIzeEM1NmliRjVadk0vQUdONzI5K0xKRFNwbHJtWVJRVHh1UTJWSE8KQWFXQ01SQWFBdUtCVnBxYTRjd25WRy9POEpkN2ZPSi9tMFlIN3FpRlJHREdvdVNOdHZJUUVtaXVkK3dRWjJ6dwpUcmFNVWk0SENtNEFPa0ZNVXBsRmt1ajA2ZHRqM2RIWUtPQkdMK25vaUp4WmJxb3kwUUtDQVFFQTFiZUl6WHh6CnRFRlp2OGRlOXljOWdCUUtNNUNIbHp6NUNMZXVkTitvemxxeDNCMW1PRStxbFkyaEd3RklIWVBJajFLYS83RlkKbExmNFpiUEJRMFhiNUo5VzQzSGIyTnEydXdRQ3ZiSXhVMW9zaGJVWlhZc2FUaE15azc2VzQ5YjU3UC9HdFE3NwpTbkVZTXNrTzRUQndyS3lBdVhDVHRtTk1Qa2J1NFBxT05PeVFQY3o3Yi92VEU1eERjMENMVS9oUXM3NWFHeCs1Citld2VjeEZNa0JKTVo2c2N5TzcySEdSNHZwTHduRXUvcU5uN2JmUElSaUx1T3BwTTdHNlUwQlBPL2todHJ5ZmQKV3U3MHJYZGJSdGRJUHlsQWxSOG9zczJqWWsrRHNPUnNESm9pbkk5WU1Va3dmdHdCNTRQbytGRGtGOHBzV202RQpSaklpenFBK0piWDlTd0tDQVFFQTA4Ly9oM0NabDg2M2xUZHNrU1JKRUZKc0RtdkZkUStzMWtlNUFwMjdnWTBXCmZJbEFGZFlRR3RORUVlTk9xS3EwdTFtS0lqWHFacWNTdU9DNzZIYTE5Tk9waHVoK1dwV0t2Ni9BTWtQSjE5SUIKQ3RqS0lkc2s0U2M3WG02MnNOV1pnQm5XT1Z3QVdzU0VzTHRac1NvWUJUVTJJS1pBOVJOWHhkSEQreGZ2SWJkNApZYngzTzk4WklNQzNlVFFiOW9jVHZab0RNWGdLaHRtTy9iMnlSeEVDSGpGRmxzYlhhc1RPeG5XOWZSVXJtdGVqCk9pdVlXaEZOM2R6dmpuVEdLY0xieWY0MWpHaUVUeFViUHVpei9ZMmk5NldCNVN6MW9zaGorRU1OaFhtRzZSYXUKQUIvelhwNldtSUJ2bDNpU0lzOGJRNkh3Qm1DTjc1R2VVVG1GUUlyaVRRS0NBUUVBbTkzWVN5MXA0VndNRGI5bApObElMRzM4Q0ZhdGlDRjR5cmpYd2FWSzVkWTVWeTFneHRmMzhSa2hkNkNrZUpGQjVsSFhGajVnVEo1dW84TnVSCnB2T3JOT2swNEhxb3dWWjZFSmtUT3JCY0l4TlFCMUFXS05BTHBrZUFDcHJreDFTQlFHVW0wZVFVUjYyRjNYd2YKZXdMdUdqRlJURzJiZlZpY1FZdFFLd3J4YmczZUFRU2ZtSU9MNVBDQmpPdlU4YS9YZzgvZlBZcjlBeFkrK3VMeAorTjB2bGlnSXZVN3lkYkNkRXpodGZVQU5qeU16cVhRemExdU1iWGNkaFEzOVFHaEIvZGhyRG1TL250Tko1YjEzCjk0bUpLbTkycDR0ckRrVEYxU3h5dWk5TjBqOFQ0U1QyU0RPOXg3ZkROOHRQdk5LYUYvUE01SU5YdXk1VGptajIKQ21EWlV3S0NBUUFOUVJYSFh1ZHRsWFR0ZEhOcHZiQ0l3ZStiRTJsZXd1VlkzMUlYZE5GWDhRRTROOHAzMDFaYwpwMTI2Rk5SR1A3QmhqTi9VOWpTOXliU2xOd0xyTUFxQTBJSHFQRUF6NE9tMnh3T3E0WTBPNFVoSmFubHpsdWYrCjR0cVhOU3hmY201UmtzeFIrSXpaSVRVQWJpalZxa0dvaWNUaVZDVDZjUVJzRDQxSStCMXhxYTV4eHo1YTA4SVoKeDVWemt5d3d5QkVYS3owSjZtNFdOQ1Q3Z2RSWEdCeGUwVXgrZStEZEFJWEQ2M2c1RElzVy9HbHRhVzcySytFSQpnaHZIZVUweExjMWRIWGd5V2hQMWN1ZXFqeHM4UVpHeUYzeENZQWJhOGRrM250S0l5S3NGaVBMSWRUZGdjMklQCkZ2SmtzeG5KN2RYUjdKODlkdXRLMDN6cHJrVEZYaXQ5QW9JQkFDcjhkb2ZCcFlFL1JuTlFwbVNET29DRm1sdTkKQlozN3h5K0puZ2FrQ2RSdHFyR1lDdkZMSnI2QnpGdXE0SHpsM0piTkRCM1BkYSs4Z2VNd2cxU1htTEhrRVFrTQpXV2ptNHpmU3hiTUtKamx3REdoeUlwSU9nQ2FQL1hyT2hxTGl4bnJ6UHFHZmM4R0FZTDE2Rm1PeGVqbVk5aERtCmNibkFqZlNwUjF1WEt2S2d6d1NLQ0VWdzc0VjJSRmRqQXBLVDl3bkpOQTZiWHQ5SXFkaS96d3BYbDQ0OVczdVMKNjRjVVpaK3luYnQ5QUlxbFNjMDdNRHl1TUtueExMbDFLeEJYenNxZlVsYWtlRGVoVmdGS05OOTNXQWJJc09ieAp1d1hTd0hXa1B6RGFHeE9wdzlSMHo2S2t2N25YZnBIYW1RWENBZEdsRjkyc1QwYW80Y3FuejFJSmJ2bz0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K\"\n }\n },\n {\n \"type\": \"certificate\",\n \"name\": \"cacert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjekNDQTF1Z0F3SUJBZ0lVVnNRZkFaTW4vazNRTU9nc0RuVEdUaU9PbGJ3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TURrMU5EQTRXaGNOCk1qUXdOakEzTURrMU5EQTRXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMlQwWXpkcjB0dWQzaVJRNGNzaGNhRVJTRzVjTDE2CkhRblhoYWw4emlUL1VRQUNIUGdzZDYwcWlEaldvQTJXb0lGWFFpUHkzOG1vZGtWRlR4Qmt5U2VldndOOFJiLzEKOFhaMS8yS1RnVmRDcHkvNm11WE15bXZYODJad05CVkV3QnoxUk5kbklUSk44cVh3a0d4bHozbDBib1loRkFyUQpNdmkxcW1RaHpDa2Zpb041MVkrYlBXOXpTQlFQdXNrcXJYYzRqTTJ0VENNQ2pTcFlvd1hXM1ppRmc5WEJ1Z09aCjFmdWd1Zmw4K1FJYzNZSEFoL1Z1NloraXFEOGxQeGRKODlBeDZaazVtOGdkVG9JdUhBbUNWaHFpUXBGRjkzSTgKbkYrSnRuYnBaNTRJUTZBbWYrYiswakMxdmY4Kzg0WUppaEVzWExyaGMxZTRTZ2dwdzEvcWpDb21QblhGVjEzUwpsUG5kVlhVR0taa1ZKdXdZTjJyZElmd3YrdCs5MGhwUVBmNmFBTjRCamRxOXdkdkQzSXVnS2JYZG5CQ0FUTEY4ClYyRTFTSE9VZGdRY3duK1d1WDVVOGdPa3B2b2VFN0g1REJ6Rks1WTZ2SHZlaTRlNkp3RTRDK3FJL1BmbTgreTEKNEpsOFBSOW5JQmdGQ3hrZWpwa2tRQ0I5U0dvMVZidzZhWmdZd0VQNHh6YXFYYXV3L3F4c0oxNUkrRTBndEs1OApuWUtkM0hqelk5Slh6V0NVNTdXbmc2SzNvTTIzNXpyRzJnNm1FaHQ4SStDckVMUFNuZURjZU8zVlJkc2dlblBCCis4U1JxVU8vWG9LWHNEU3I5amoxdWluVzYwTG5MZ0Zmc3JQeGlQVlZlMFh1TFZESlhCSlNoRDZDeGRyMnBSOGQKS25SRDZrTFpZZEtMQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqVwpWREFmQmdOVkhTTUVHREFXZ0JRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqV1ZEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJad3B4Z2Z4N2thZFhvRHNyT1hUVXJ6dEFPMkFQRVJNaTAKaTkyNk9DTGFPbVVYZW1uKytXSUU1K2tUSE0wcS8vbUZCTURzSmdZSFVLUlNvRGNsNmh4TnVFNUNzS2trRVFTSgpMTHZrWlB0S2J5NGlxMitLZ1JtdVZxbXJNVTBYQzZMZDl3WmttL2huUjNtT3V6bko4MGZmV1JDQ0xGWDEwY2EzCnc5TGM1d1JLTFBZZXQvcEs5SitOYWN3TFJRYTczVFovMUpQNW9BU3czVjNoYkxlLy9UeWpnOURqUlZGY3FYWnEKWWs2Mm5qSkhZVzh3WmlhZzc0QXU4dHE5OG5KandBV1ROMFV5L2w1Q2VpWnV5bzZlU0RHVDNJNm1BdGU1VXBvWAppNXBkYlZ6VDdOZC9IOEwwZHZNdVZ2N0FmakZlcU91cUZNNkkzTnlvbStLWENxNmJQdGxBWEkzeVFZc0t4ZlRkCkw3SnRaTmx6MGJ6eHJhcHI4RmpYcjhML1ZkeHQza00xMnJwb2kzL3hsckR6Q2Q2b2YrQ1MxelBocUdpOUhvcUoKZEU5VGhYMklTdkd2akVSYzVVNFRsNjJBNHNyeGJQbUt0eWx3dGNGVEJacUJiRGY3ZjBBc2cveWhndXdTcktsQQpBNkRWVXVCRFErdGpwZ0N0b0ZlOEhLVDJ6UFVlaEQ2ZjVNQkhmU2ZUZ1crTlhFSXNvVDNsampjY1hsYXhPcFJWCkNQNWxCczNmekxyYnBxbUlLaWZhdWlTNWM4TzlSUjhjQTVzeWlBOTBmbmJIdDlmdGxpRG9jcFRzNUtrbjk2NkIKZUxMM1dXVldCYUtvanJzY1RkVXJoalNnVVBmam5FTXpnVzR2eEc3d3BVNHR2ME4yaEtHUWc0bVhhcDV0SU5Pcwp4WktnZXRHUldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"vm-blank.ff.lan\"\n ],\n \"resolver\": \"internal_lan\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"server_cert\",\n \"key\": \"server_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"mTLS-client-profile\"\n }\n ]\n }\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://origin_server\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"origin_server\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"mTLS-client-profile\",\n \"type\": \"mtls\",\n \"mtls\": {\n \"enabled\": \"on\",\n \"client_certificates\": \"cacert\",\n \"trusted_ca_certificates\": \"cacert\",\n \"ocsp\": {\n \"enabled\": \"on\",\n \"responder\": \"http://ocsp.k8s.ie.ff.lan\"\n },\n \"stapling\": {\n \"enabled\": true,\n \"verify\": true,\n \"responder\": \"http://ocsp.k8s.ie.ff.lan\"\n }\n }\n }\n ]\n },\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"internal_lan\",\n \"address\": \"192.168.2.13\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test service\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Auth with external key and Bearer token\"\n }\n ]\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n }\n }\n ]\n }\n ]\n }\n }\n}", "options": { "raw": { "language": "json" @@ -7811,7 +8150,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7819,19 +8158,15 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config" + "config", + "{{configUid}}" ] } }, "response": [] - } - ] - }, - { - "name": "NGINX App Protect WAF", - "item": [ + }, { - "name": "Create initial NGINX configuration with NGINX App Protect WAF", + "name": "JWT token in auth_token query string parameter", "event": [ { "listen": "test", @@ -7849,11 +8184,11 @@ } ], "request": { - "method": "POST", + "method": "PATCH", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ],\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\",\n \"log\": {\n \"profile_name\": \"secops_dashboard\",\n \"enabled\": true,\n \"destination\": \"127.0.0.1:514\"\n }\n }\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test service\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Auth with hardwired key and token in auth_token query string parameter\"\n }\n ]\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n }\n }\n ]\n }\n ]\n }\n }\n}", "options": { "raw": { "language": "json" @@ -7861,7 +8196,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7869,14 +8204,15 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config" + "config", + "{{configUid}}" ] } }, "response": [] }, { - "name": "Change active NGINX App Protect policy", + "name": "JWT token in HTTP X-Auth-Token header", "event": [ { "listen": "test", @@ -7898,7 +8234,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-allowed\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"Production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"Production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Test service\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Auth with hardwired key and token in X-Auth-Token HTTP header\"\n }\n ]\n },\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n }\n }\n ]\n }\n ]\n }\n }\n}", "options": { "raw": { "language": "json" @@ -7920,9 +8256,14 @@ } }, "response": [] - }, + } + ] + }, + { + "name": "JWT Client Authentication and Authorization", + "item": [ { - "name": "Update TLS certificates", + "name": "JWT Client Authentication and Authorization", "event": [ { "listen": "test", @@ -7940,11 +8281,11 @@ } ], "request": { - "method": "PATCH", + "method": "POST", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_app_protect_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert2.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert2.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"JWT AuthN and AuthZ test server\",\n \"resolver\": \"Google\",\n \"names\": [\n \"test.nginx.lab\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"headers\": {\n \"to_client\": {\n \"add\": [\n {\n \"name\": \"X-Injected-JWT-Group\",\n \"value\": \"$jwt_claim_roles\"\n }\n ]\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://test_upstream\",\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"jwt_authentication_local\"\n }\n ]\n },\n \"authorization\": {\n \"profile\": \"jwt role based authorization\"\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"test_upstream\",\n \"origin\": [\n {\n \"server\": \"echo.free.beeceptor.com\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"jwt_authentication_local\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"JWT Client Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"jwt_type\": \"signed\"\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"jwt role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ]\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7952,7 +8293,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", "protocol": "http", "host": [ "{{ncg_host}}" @@ -7960,15 +8301,19 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config", - "{{configUid}}" + "config" ] } }, "response": [] - }, + } + ] + }, + { + "name": "mTLS Client Authentication", + "item": [ { - "name": "Disable NGINX App Protect WAF", + "name": "HTTPS server with mTLS, OCSP, SSL Stapling", "event": [ { "listen": "test", @@ -7981,16 +8326,17 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], "request": { - "method": "PATCH", + "method": "POST", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ]\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"vm-blank.ff.lan\"\n ],\n \"resolver\": \"internal_lan\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"server_cert\",\n \"key\": \"server_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"mTLS-client-profile\"\n }\n ]\n }\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://origin_server\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"origin_server\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"mTLS-client-profile\",\n \"type\": \"mtls\",\n \"mtls\": {\n \"enabled\": \"on\",\n \"client_certificates\": \"cacert\",\n \"trusted_ca_certificates\": \"cacert\",\n \"ocsp\": {\n \"enabled\": \"on\",\n \"responder\": \"http://ocsp.k8s.ie.ff.lan\"\n },\n \"stapling\": {\n \"enabled\": true,\n \"verify\": true,\n \"responder\": \"http://ocsp.k8s.ie.ff.lan\"\n }\n }\n }\n ]\n },\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"internal_lan\",\n \"address\": \"192.168.2.13\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"server_cert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdSRENDQkN5Z0F3SUJBZ0lVTTNJQVZIRmxhSTVsY1d0TjZxOUVhcnlka0w4d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TVRBd01qTTVXaGNOCk1qUXdOakEzTVRBd01qTTVXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMRFQ2bnZleVZlNi9VZlk2aUtHVC9oV1A0cktDSGR0ClloZWU3RGVZR29QWGhGVjB6a3grVWExanBEZ21WUE1kVEJBdnoxODg5NzlEcHBqdmNYeFhsRmpnaUhjWDhpWVgKSXovSUVMc3dKRUNITWNsNkxmelA5eDVUY1gxTEdFblFOTWhHRzA2MjlxU2NCQmQyUUNiWlY0UWE1TkxlQnQ4cQpHQ2lXY3JiQnR3YlpiSGo1dk9aenJrdHBtRFBGS1V4bXR5b2dBQnNaTllnL0F3Y1l2RXdBOEQ0QTN0VEgxcGhvCkdYY3ZvZWpJelhRMUdmYys5azR3OFhHYWFQOGd2bTdOMXN2MnU2Yld4SHRGZHpWQk9udzJyaHUvWGYyY0N0dW4KUnIxSENKQXRRSDlkbDhzZks1czBSRlVuTlVYbFBiNTFBTjBjVFVGbEYrZlVUVmVON3dNMTdmeVZVY3IydTltSwo0UGdoWjkvMml0ZUpZV3hjK3k4V2NEQzBUV3hwZ2paVEw5Tk1GK2t6SXV2TjJOWFFybjcvSU5UQTMvNFlmWGRPCloxelpTdTlkclRMcG5DZHRpOWxuRHBKODd3bW41cVZSTlZiTlZRbldEeW5yZnoyTU1DY21jLzcvdkJFN2dDemQKNFJLWHJLdHloenlQSitycmh3NmpxYVA4QytaZGRvKzkvak9QVDFTSnUxZ21VbzFuZ2hBMWh2N0M5RUYrM2xQVApYSk5WV3dtYkdWK0p4cUdKSjJSa2toMlIrZTVIREdRY2hGWjJIcXBGTGVQN0trTHJBR2RkZFZQWEZhQ0RiU0R6ClJQd0I5WFlhakg5Zm5QWEtFT3ZpVEJhQVNjWUZwTXB5cm02UkxHUGRSVnE2RUNYVlB4MDdHdGFCaEVvVWIwK2YKVkZnNExtQkx4MldQQWdNQkFBR2pnZ0VpTUlJQkhqQUpCZ05WSFJNRUFqQUFNQkVHQ1dDR1NBR0crRUlCQVFRRQpBd0lHUURBekJnbGdoa2dCaHZoQ0FRMEVKaFlrVDNCbGJsTlRUQ0JIWlc1bGNtRjBaV1FnVTJWeWRtVnlJRU5sCmNuUnBabWxqWVhSbE1CMEdBMVVkRGdRV0JCVHZFZWJGK1JDV0JhcGVPWUdpQ0YyVHZxbExYekNCaEFZRFZSMGoKQkgwd2U0QVVFdW9Db3kvcmhMQmxzcm5KdXE2QzFJczQxbFNoVGFSTE1Fa3hDekFKQmdOVkJBWVRBa2xVTVEwdwpDd1lEVlFRSURBUkJjM1JwTVJFd0R3WURWUVFLREFoVVpYTjBJRXhoWWpFWU1CWUdBMVVFQXd3UGRtMHRZbXhoCmJtc3VabVl1YkdGdWdoUld4QjhCa3lmK1RkQXc2Q3dPZE1aT0k0NlZ2REFPQmdOVkhROEJBZjhFQkFNQ0JhQXcKRXdZRFZSMGxCQXd3Q2dZSUt3WUJCUVVIQXdFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFHUDR6ZkdseTI1RwpneTBSeC9SSTNpNzJDVlIrSXY3SW5WTUVGWDZqRHRNV3hSblFtRGZsMWtTOVF1Y3hNb0tnOE9URStMcnlzdGJsClF4WGZiakZQekNoNHB1UGtGTmNBeG1mVmR4b20xR1lodWpoYTBQOUswUURZSDZycGlUaFdSQ2greUovQm1qZ2wKTlJabks4WGRqME85Ui9XKzJrTFRac2VFbS9hZHFVQ3dkYzNBWWlNWGh4QXkvQlh3bFRQeDMyMHZCcXYxZGFyVgp5ZlVoRlM1Rkg3enV2bGtGQ1p6M3lpOGYvYXMwbkRTUkFrY3dPRFQvN1diQlN4QTk3ZzJmRk1EMEI3WlUvbndGCmU4VnRzNDl3YmZ6QWJRMk40RUc2OEVhODE1VlFRM2N6YWthdjBCdkxHL2UwT0habGxYcUVhV1ZlWFJtSWFFOHcKWko5OEhUaDJMbUlFV2Jpdm94Kyt2UXd3bVhKTm1DRFVXNnVmcHdBOVdKQ0VhYmhxeXdGVzh1dFVENzRTVXE3SApEUDhNamtJZ0o3ekl2Tkd1RkFsSzd6c2xpV2pzeUN1OGVNamhvN2pVRFhGR1R0R0ZMUGtVa08vSysrSGVVRFg0Cm1OWDJ2aHI3NGRqRkNBTTEvOTYxWnB5NUFYUzZkd2g3MFlJL2dMdldSL0J1ejBnNEp6YUI2UFo4M1ErYm9QVHYKM1ZIS2xOWjlKQlhRTmtSc3N6U0dYWG5MYmtOTmNwVFg2cnAyZ1pUSS9NNDhGTnBxanAxOXRpQVg3bWN0cTl2SgpNejhvemhEcHZmSTlnMjFsNFZlRGdpbWEwTDVBc1pQbFdIQlZjcy9yL3dMU2YzWFVYZEs0UHpCQUdIRFBidXYrCnpKOVNqS0NFVll2bHRhMHlUUVBCSFJPa2Y2MG1sVmh6Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"server_key\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBc05QcWU5N0pWN3I5UjlqcUlvWlArRlkvaXNvSWQyMWlGNTdzTjVnYWc5ZUVWWFRPClRINVJyV09rT0NaVTh4MU1FQy9QWHp6M3YwT21tTzl4ZkZlVVdPQ0lkeGZ5SmhjalA4Z1F1ekFrUUljeHlYb3QKL00vM0hsTnhmVXNZU2RBMHlFWWJUcmIycEp3RUYzWkFKdGxYaEJyazB0NEczeW9ZS0paeXRzRzNCdGxzZVBtOAo1bk91UzJtWU04VXBUR2EzS2lBQUd4azFpRDhEQnhpOFRBRHdQZ0RlMU1mV21HZ1pkeStoNk1qTmREVVo5ejcyClRqRHhjWnBvL3lDK2JzM1d5L2E3cHRiRWUwVjNOVUU2ZkRhdUc3OWQvWndLMjZkR3ZVY0lrQzFBZjEyWHl4OHIKbXpSRVZTYzFSZVU5dm5VQTNSeE5RV1VYNTlSTlY0M3ZBelh0L0pWUnl2YTcyWXJnK0NGbjMvYUsxNGxoYkZ6NwpMeFp3TUxSTmJHbUNObE12MDB3WDZUTWk2ODNZMWRDdWZ2OGcxTURmL2hoOWQwNW5YTmxLNzEydE11bWNKMjJMCjJXY09rbnp2Q2FmbXBWRTFWczFWQ2RZUEtldC9QWXd3Snlaei92KzhFVHVBTE4zaEVwZXNxM0tIUEk4bjZ1dUgKRHFPcG8vd0w1bDEyajczK000OVBWSW03V0NaU2pXZUNFRFdHL3NMMFFYN2VVOU5jazFWYkNac1pYNG5Hb1lrbgpaR1NTSFpINTdrY01aQnlFVm5ZZXFrVXQ0L3NxUXVzQVoxMTFVOWNWb0lOdElQTkUvQUgxZGhxTWYxK2M5Y29RCjYrSk1Gb0JKeGdXa3luS3VicEVzWTkxRldyb1FKZFUvSFRzYTFvR0VTaFJ2VDU5VVdEZ3VZRXZIWlk4Q0F3RUEKQVFLQ0FnQVBUR1pQRFRsU004VlIvL3hSdkZrUzNUTm1LSkNPOUpHMkJYUGVZM1IzejUrTlhTdTBCb0craEk1aQpwVDVZUWtLZ2ErSi9GT0ZDVlBJRzdVQmVSNTE0Q3dVRGVMamtmci8zOXJFcjRNQmlMTkFyNUR3eVVUUEtGZUlOCnV2K0E4MWg5czBNTmpsck1ad3NibElsOFV2VjFZblpGb0J2c0Z0SThRTGZ3QTlaMzZ6dXRRNzRLR2h3TVBqaUMKMGgzK2xDeG9vcGdmd0JDWGx3d0dBeWZYVTRWMWQ5SFBpdktRQVFHakJDWDM0OWVTcEQxNDNLT21wQ2xmY01LQQp3QzU1bTZsbndCTUFIamlsaVo4RXBuNE8zUlEzSmxsVlpiaXl4RWdrZkE3TG1uNm9Ca3Jwc2VxdDVObThuRVhKCnBFbXhQcUl5Znc1WUNBMEhhNkM5WUhRN1RPRW9BbHBmWld4azAxSnpoVi9aK3FmVHM1YlMwQWNaTzFOVDRaeDgKWlF2eHQ0TDJINVcrK2R6RjhReTlidzQ2M3lKb1dydWxtNy9uQ3YvL1FpNGl0eHRnYyt0N2lwVXZzaUdTVktVWQpPelhCSXNWTUlnd0F6eUtTSEhPL21rMkEwVkgxaHB3emY2L0RzR2wxSjM4TU9pVGo4dEx1RWt3cFY4WGh5MnZwCkd0cXpsT21DS1hodlVDam9iZWlYSWJwSlIzeEM1NmliRjVadk0vQUdONzI5K0xKRFNwbHJtWVJRVHh1UTJWSE8KQWFXQ01SQWFBdUtCVnBxYTRjd25WRy9POEpkN2ZPSi9tMFlIN3FpRlJHREdvdVNOdHZJUUVtaXVkK3dRWjJ6dwpUcmFNVWk0SENtNEFPa0ZNVXBsRmt1ajA2ZHRqM2RIWUtPQkdMK25vaUp4WmJxb3kwUUtDQVFFQTFiZUl6WHh6CnRFRlp2OGRlOXljOWdCUUtNNUNIbHp6NUNMZXVkTitvemxxeDNCMW1PRStxbFkyaEd3RklIWVBJajFLYS83RlkKbExmNFpiUEJRMFhiNUo5VzQzSGIyTnEydXdRQ3ZiSXhVMW9zaGJVWlhZc2FUaE15azc2VzQ5YjU3UC9HdFE3NwpTbkVZTXNrTzRUQndyS3lBdVhDVHRtTk1Qa2J1NFBxT05PeVFQY3o3Yi92VEU1eERjMENMVS9oUXM3NWFHeCs1Citld2VjeEZNa0JKTVo2c2N5TzcySEdSNHZwTHduRXUvcU5uN2JmUElSaUx1T3BwTTdHNlUwQlBPL2todHJ5ZmQKV3U3MHJYZGJSdGRJUHlsQWxSOG9zczJqWWsrRHNPUnNESm9pbkk5WU1Va3dmdHdCNTRQbytGRGtGOHBzV202RQpSaklpenFBK0piWDlTd0tDQVFFQTA4Ly9oM0NabDg2M2xUZHNrU1JKRUZKc0RtdkZkUStzMWtlNUFwMjdnWTBXCmZJbEFGZFlRR3RORUVlTk9xS3EwdTFtS0lqWHFacWNTdU9DNzZIYTE5Tk9waHVoK1dwV0t2Ni9BTWtQSjE5SUIKQ3RqS0lkc2s0U2M3WG02MnNOV1pnQm5XT1Z3QVdzU0VzTHRac1NvWUJUVTJJS1pBOVJOWHhkSEQreGZ2SWJkNApZYngzTzk4WklNQzNlVFFiOW9jVHZab0RNWGdLaHRtTy9iMnlSeEVDSGpGRmxzYlhhc1RPeG5XOWZSVXJtdGVqCk9pdVlXaEZOM2R6dmpuVEdLY0xieWY0MWpHaUVUeFViUHVpei9ZMmk5NldCNVN6MW9zaGorRU1OaFhtRzZSYXUKQUIvelhwNldtSUJ2bDNpU0lzOGJRNkh3Qm1DTjc1R2VVVG1GUUlyaVRRS0NBUUVBbTkzWVN5MXA0VndNRGI5bApObElMRzM4Q0ZhdGlDRjR5cmpYd2FWSzVkWTVWeTFneHRmMzhSa2hkNkNrZUpGQjVsSFhGajVnVEo1dW84TnVSCnB2T3JOT2swNEhxb3dWWjZFSmtUT3JCY0l4TlFCMUFXS05BTHBrZUFDcHJreDFTQlFHVW0wZVFVUjYyRjNYd2YKZXdMdUdqRlJURzJiZlZpY1FZdFFLd3J4YmczZUFRU2ZtSU9MNVBDQmpPdlU4YS9YZzgvZlBZcjlBeFkrK3VMeAorTjB2bGlnSXZVN3lkYkNkRXpodGZVQU5qeU16cVhRemExdU1iWGNkaFEzOVFHaEIvZGhyRG1TL250Tko1YjEzCjk0bUpLbTkycDR0ckRrVEYxU3h5dWk5TjBqOFQ0U1QyU0RPOXg3ZkROOHRQdk5LYUYvUE01SU5YdXk1VGptajIKQ21EWlV3S0NBUUFOUVJYSFh1ZHRsWFR0ZEhOcHZiQ0l3ZStiRTJsZXd1VlkzMUlYZE5GWDhRRTROOHAzMDFaYwpwMTI2Rk5SR1A3QmhqTi9VOWpTOXliU2xOd0xyTUFxQTBJSHFQRUF6NE9tMnh3T3E0WTBPNFVoSmFubHpsdWYrCjR0cVhOU3hmY201UmtzeFIrSXpaSVRVQWJpalZxa0dvaWNUaVZDVDZjUVJzRDQxSStCMXhxYTV4eHo1YTA4SVoKeDVWemt5d3d5QkVYS3owSjZtNFdOQ1Q3Z2RSWEdCeGUwVXgrZStEZEFJWEQ2M2c1RElzVy9HbHRhVzcySytFSQpnaHZIZVUweExjMWRIWGd5V2hQMWN1ZXFqeHM4UVpHeUYzeENZQWJhOGRrM250S0l5S3NGaVBMSWRUZGdjMklQCkZ2SmtzeG5KN2RYUjdKODlkdXRLMDN6cHJrVEZYaXQ5QW9JQkFDcjhkb2ZCcFlFL1JuTlFwbVNET29DRm1sdTkKQlozN3h5K0puZ2FrQ2RSdHFyR1lDdkZMSnI2QnpGdXE0SHpsM0piTkRCM1BkYSs4Z2VNd2cxU1htTEhrRVFrTQpXV2ptNHpmU3hiTUtKamx3REdoeUlwSU9nQ2FQL1hyT2hxTGl4bnJ6UHFHZmM4R0FZTDE2Rm1PeGVqbVk5aERtCmNibkFqZlNwUjF1WEt2S2d6d1NLQ0VWdzc0VjJSRmRqQXBLVDl3bkpOQTZiWHQ5SXFkaS96d3BYbDQ0OVczdVMKNjRjVVpaK3luYnQ5QUlxbFNjMDdNRHl1TUtueExMbDFLeEJYenNxZlVsYWtlRGVoVmdGS05OOTNXQWJJc09ieAp1d1hTd0hXa1B6RGFHeE9wdzlSMHo2S2t2N25YZnBIYW1RWENBZEdsRjkyc1QwYW80Y3FuejFJSmJ2bz0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K\"\n }\n },\n {\n \"type\": \"certificate\",\n \"name\": \"cacert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjekNDQTF1Z0F3SUJBZ0lVVnNRZkFaTW4vazNRTU9nc0RuVEdUaU9PbGJ3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TURrMU5EQTRXaGNOCk1qUXdOakEzTURrMU5EQTRXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMlQwWXpkcjB0dWQzaVJRNGNzaGNhRVJTRzVjTDE2CkhRblhoYWw4emlUL1VRQUNIUGdzZDYwcWlEaldvQTJXb0lGWFFpUHkzOG1vZGtWRlR4Qmt5U2VldndOOFJiLzEKOFhaMS8yS1RnVmRDcHkvNm11WE15bXZYODJad05CVkV3QnoxUk5kbklUSk44cVh3a0d4bHozbDBib1loRkFyUQpNdmkxcW1RaHpDa2Zpb041MVkrYlBXOXpTQlFQdXNrcXJYYzRqTTJ0VENNQ2pTcFlvd1hXM1ppRmc5WEJ1Z09aCjFmdWd1Zmw4K1FJYzNZSEFoL1Z1NloraXFEOGxQeGRKODlBeDZaazVtOGdkVG9JdUhBbUNWaHFpUXBGRjkzSTgKbkYrSnRuYnBaNTRJUTZBbWYrYiswakMxdmY4Kzg0WUppaEVzWExyaGMxZTRTZ2dwdzEvcWpDb21QblhGVjEzUwpsUG5kVlhVR0taa1ZKdXdZTjJyZElmd3YrdCs5MGhwUVBmNmFBTjRCamRxOXdkdkQzSXVnS2JYZG5CQ0FUTEY4ClYyRTFTSE9VZGdRY3duK1d1WDVVOGdPa3B2b2VFN0g1REJ6Rks1WTZ2SHZlaTRlNkp3RTRDK3FJL1BmbTgreTEKNEpsOFBSOW5JQmdGQ3hrZWpwa2tRQ0I5U0dvMVZidzZhWmdZd0VQNHh6YXFYYXV3L3F4c0oxNUkrRTBndEs1OApuWUtkM0hqelk5Slh6V0NVNTdXbmc2SzNvTTIzNXpyRzJnNm1FaHQ4SStDckVMUFNuZURjZU8zVlJkc2dlblBCCis4U1JxVU8vWG9LWHNEU3I5amoxdWluVzYwTG5MZ0Zmc3JQeGlQVlZlMFh1TFZESlhCSlNoRDZDeGRyMnBSOGQKS25SRDZrTFpZZEtMQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqVwpWREFmQmdOVkhTTUVHREFXZ0JRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqV1ZEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJad3B4Z2Z4N2thZFhvRHNyT1hUVXJ6dEFPMkFQRVJNaTAKaTkyNk9DTGFPbVVYZW1uKytXSUU1K2tUSE0wcS8vbUZCTURzSmdZSFVLUlNvRGNsNmh4TnVFNUNzS2trRVFTSgpMTHZrWlB0S2J5NGlxMitLZ1JtdVZxbXJNVTBYQzZMZDl3WmttL2huUjNtT3V6bko4MGZmV1JDQ0xGWDEwY2EzCnc5TGM1d1JLTFBZZXQvcEs5SitOYWN3TFJRYTczVFovMUpQNW9BU3czVjNoYkxlLy9UeWpnOURqUlZGY3FYWnEKWWs2Mm5qSkhZVzh3WmlhZzc0QXU4dHE5OG5KandBV1ROMFV5L2w1Q2VpWnV5bzZlU0RHVDNJNm1BdGU1VXBvWAppNXBkYlZ6VDdOZC9IOEwwZHZNdVZ2N0FmakZlcU91cUZNNkkzTnlvbStLWENxNmJQdGxBWEkzeVFZc0t4ZlRkCkw3SnRaTmx6MGJ6eHJhcHI4RmpYcjhML1ZkeHQza00xMnJwb2kzL3hsckR6Q2Q2b2YrQ1MxelBocUdpOUhvcUoKZEU5VGhYMklTdkd2akVSYzVVNFRsNjJBNHNyeGJQbUt0eWx3dGNGVEJacUJiRGY3ZjBBc2cveWhndXdTcktsQQpBNkRWVXVCRFErdGpwZ0N0b0ZlOEhLVDJ6UFVlaEQ2ZjVNQkhmU2ZUZ1crTlhFSXNvVDNsampjY1hsYXhPcFJWCkNQNWxCczNmekxyYnBxbUlLaWZhdWlTNWM4TzlSUjhjQTVzeWlBOTBmbmJIdDlmdGxpRG9jcFRzNUtrbjk2NkIKZUxMM1dXVldCYUtvanJzY1RkVXJoalNnVVBmam5FTXpnVzR2eEc3d3BVNHR2ME4yaEtHUWc0bVhhcDV0SU5Pcwp4WktnZXRHUldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -7998,7 +8344,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", "protocol": "http", "host": [ "{{ncg_host}}" @@ -8006,8 +8352,7 @@ "port": "{{ncg_port}}", "path": [ "{{ngc_api_version}}", - "config", - "{{configUid}}" + "config" ] } }, @@ -8177,7 +8522,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -8186,7 +8532,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\",\n \"authentication\": [\n {\n \"profile\": \"Basic authentication profile\"\n }\n ]\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\",\n \"authentication\": {\n \"server\": [\n {\n \"profile\": \"Bearer token-based authentication profile\"\n }\n ]\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"server\": [\n {\n \"name\": \"Bearer token-based authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU\",\n \"type\": \"bearer\"\n }\n },\n {\n \"name\": \"Header-based authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU\",\n \"type\": \"header\",\n \"location\": \"X-AUTH-TOKEN\"\n }\n },\n {\n \"name\": \"Basic authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"type\": \"basic\",\n \"username\": \"authusername\",\n \"password\": \"YXV0aHBhc3N3b3Jk\"\n }\n }\n ]\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\",\n \"authentication\": {\n \"server\": [\n {\n \"profile\": \"Bearer token-based authentication profile\"\n }\n ]\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"server\": [\n {\n \"name\": \"Bearer token-based authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU\",\n \"type\": \"bearer\"\n }\n },\n {\n \"name\": \"Header-based authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU\",\n \"type\": \"header\",\n \"location\": \"X-AUTH-TOKEN\"\n }\n },\n {\n \"name\": \"Basic authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"type\": \"basic\",\n \"username\": \"authusername\",\n \"password\": \"YXV0aHBhc3N3b3Jk\"\n }\n }\n ]\n }\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\",\n \"authentication\": [\n {\n \"profile\": \"Basic authentication profile\"\n }\n ]\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -8222,7 +8568,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -8231,7 +8578,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\",\n \"authentication\": [\n {\n \"profile\": \"Basic authentication profile\"\n }\n ]\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n },\n {\n \"type\": \"certificate\",\n \"name\": \"client_cert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZBakNDQStxZ0F3SUJBZ0lVYXZ1aFhBOWFLVFJlYmZ2Y1BFU2Z0MjBUQXhzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZqRUxNQWtHQTFVRUJoTUNTVVV4RFRBTEJnTlZCQWdNQkVOdmNtc3hEVEFMQmdOVkJBY01CRU52Y21zeApFVEFQQmdOVkJBb01DRUZqYldVZ1RIUmtNUll3RkFZRFZRUUREQTEwWlhOMExtRmpiV1F1YkdGdU1CNFhEVEkwCk1EUXhOVEUzTURnMU0xb1hEVEkxTURReE5URTNNRGcxTTFvd1dERUxNQWtHQTFVRUJoTUNTVVV4RFRBTEJnTlYKQkFnTUJFTnZjbXN4RFRBTEJnTlZCQWNNQkVOdmNtc3hFVEFQQmdOVkJBb01DRUZqYldVZ1RIUmtNUmd3RmdZRApWUVFEREE5amJHbGxiblF1WVdOdFpTNXNZV0l3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUURUQ2kydi8rc08rdTJTcFF5ZVBLM3hnb3RyRUlDZGJYMmN4N0xkcnRDbE82a0xTM3IybWpxV1ptWkQKUWkvL0dIZXhYS3NaelBURDUyN0ZMZlREcExIb2h1MldmeUErQy9HN2JycXlNT0dQZ3lVcEI2NWN2THU4V1BNOApPa3lxVFdma0xkRnF2akFGclU5czMxUnljT3BQSlB0cFloRWlhQXZRWDlwRnhjalM2NUJscUFCMjY1YnlncGs2CmpsV1E5NTVWUzlmZlNLU3hpQTRCQXAzMHV3Rm5YRWtMcGRCenI1TkFKeXJqdXhzbHJGVEs4SGxvRmQ2MndzQUMKRjYrRGZmQ2FNLzVockljRkswSVFheHBpaWUyWllKaVFmNXJMeVd6VG1xMVh1QmsyaEhBWDNvQUY2bW9hcnVNOAo5UlhxQmlaNnFWdGFPQXFEK0pRVGNpYmVzekQ2Z2xoSitGM0VFTEJOWVhETmFLbGprQXRxVWFwYStXZEdVUkU4CnZvczA4TSsvOUlhWTdQeGtQNXB6bDhmaS9RaS9ESW9WLzh0UUlydFBIYzJqSTFSRkZoL3BpeDFsR2lyTlRBK0QKbTlURDJKT0hTU3VmdkRkRnV1YjFwMnF5TW5Nd3FFNklHOGpmTEg2TGNxRGFSbmcveVpVUTBqa01LSFYrd1gwegpkZ1RsMDVVWjZtMFpFNUdlK1FRaG5nY0FUemdrSWp3WlJod1JLOEx1Nmtwb2Vnb0dMUkhkTVNqcUV0NkNWc25BCmFLZ0hTbTJROE9MS1lJdlhVN1RpME9DNm5OdU40RDlKdkxGQXdPMUVFU2tCUXFQeThGby8zRVNZWU1FazJ6RzQKc3I0UXJ4Q2xuY2pwbUMrdkRmdHJuR055SVJvditOeS9zd2FSdkcvcm15ZnhEYVdNL3dJREFRQUJvNEhGTUlIQwpNQWtHQTFVZEV3UUNNQUF3RVFZSllJWklBWWI0UWdFQkJBUURBZ1dnTURNR0NXQ0dTQUdHK0VJQkRRUW1GaVJQCmNHVnVVMU5NSUVkbGJtVnlZWFJsWkNCRGJHbGxiblFnUTJWeWRHbG1hV05oZEdVd0hRWURWUjBPQkJZRUZGQmIKdmltZDYxekxLdlA0U2RZRFRWbndYdFVwTUI4R0ExVWRJd1FZTUJhQUZLY29GRHpMVnc1QXBiMzB5UTM0c25MZQpHQ1FWTUE0R0ExVWREd0VCL3dRRUF3SUY0REFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVICkF3UXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSmg0cm9kZEVGemJwWk5kSW5zUmdubWVnWVIxSWlzUUxRU0IKcmNydEZxVmtLb3Rsc09EUXBFMThIRjBsbVA4WE9IU0hqYytYUVF5YlFNd1ViZ2RNbnhBZE1WaGFaMXppWElnaQpiUHgwOEY0YXR5MElJY1hyOVpFVnZTd1pheURBZHErb2s5RGpoRjQwYU5iQmFBTXB2NTRCL2U3OUNMSWZ6REo4CnNZaWw3K09abWlOUTJtZUNreVBYdXdhd3hTeVRnNVhWS3Q4VEtKQVJ5aTFJeWRHWkZRMTJGWFJHTE1BSjdaYngKRzlPd1ZvazExenpWNkRQZHFuZU5ER3BQRU5WZ2VmVjI0ZU1JVXUrYzhnSThYTU1GMU9VVWR3MmlEQmU4Q01TQQppc2h2aDFWYVZPNC96czlma2dLV2FXejNwQWprN3pkbWdaUnpXRUVHR0JMekJoQk5FQTg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"client_key\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRRFRDaTJ2LytzTyt1MlMKcFF5ZVBLM3hnb3RyRUlDZGJYMmN4N0xkcnRDbE82a0xTM3IybWpxV1ptWkRRaS8vR0hleFhLc1p6UFRENTI3RgpMZlREcExIb2h1MldmeUErQy9HN2JycXlNT0dQZ3lVcEI2NWN2THU4V1BNOE9reXFUV2ZrTGRGcXZqQUZyVTlzCjMxUnljT3BQSlB0cFloRWlhQXZRWDlwRnhjalM2NUJscUFCMjY1YnlncGs2amxXUTk1NVZTOWZmU0tTeGlBNEIKQXAzMHV3Rm5YRWtMcGRCenI1TkFKeXJqdXhzbHJGVEs4SGxvRmQ2MndzQUNGNitEZmZDYU0vNWhySWNGSzBJUQpheHBpaWUyWllKaVFmNXJMeVd6VG1xMVh1QmsyaEhBWDNvQUY2bW9hcnVNODlSWHFCaVo2cVZ0YU9BcUQrSlFUCmNpYmVzekQ2Z2xoSitGM0VFTEJOWVhETmFLbGprQXRxVWFwYStXZEdVUkU4dm9zMDhNKy85SWFZN1B4a1A1cHoKbDhmaS9RaS9ESW9WLzh0UUlydFBIYzJqSTFSRkZoL3BpeDFsR2lyTlRBK0RtOVREMkpPSFNTdWZ2RGRGdXViMQpwMnF5TW5Nd3FFNklHOGpmTEg2TGNxRGFSbmcveVpVUTBqa01LSFYrd1gwemRnVGwwNVVaNm0wWkU1R2UrUVFoCm5nY0FUemdrSWp3WlJod1JLOEx1Nmtwb2Vnb0dMUkhkTVNqcUV0NkNWc25BYUtnSFNtMlE4T0xLWUl2WFU3VGkKME9DNm5OdU40RDlKdkxGQXdPMUVFU2tCUXFQeThGby8zRVNZWU1FazJ6RzRzcjRRcnhDbG5janBtQyt2RGZ0cgpuR055SVJvditOeS9zd2FSdkcvcm15ZnhEYVdNL3dJREFRQUJBb0lDQUJzWEZBK2krRmVFbW5rdE9xdHRUL1FsCk5TUlozL05WYjJuRlcyUGRqRHhKcGtUTzV2VS9qYThVd2ZmTVIrdWxCbWhSWkVmOFBweVBMc2J5USszV29iSjAKUk9JQlprVjdYd2ZDWDdEVUJDc0VtS3ZscDlvN3JVQmJqV0w1SmpJNDhYeDI3VFR0NlFMY05uVXhUZDUxanRPagpXYXFJdzNqNU1Oc0tFdDRncWlET2RhQzIvMzJaekZkTHNHNWdnRmRnUElZOUpYUXN3bHk2VnZjdzVpU0RoTnRICkcyYWxYYXdiL2s1Sk9OWTIyY3RDT0kyUnhPUGtPc3lYRkoxYTBRQStGYmxBWExKenVubE5ZNU9iOXEwWTFpa2sKSHpGeXBUcENSdmY2dzY3em00NUYvZVdkS0MzdmpnM29JK29GUS9vMTJUdjhWV3Bhc0ptSmoraUJ5aFRpOGx4YQpMempXaHNrUFZJUGJDYjFDTmIzZHNQSWVWYTVQYmRORGh2bHBQZFV4cXhKRGI4ZUFhemxSQXJVdmtaQnpkTjZtCjVwekljNGtMQnd3Wno5eGg1MzdsQ0tlZ3ZJYmdEMlQvMEM4SVFsWmFIK1M3azlWaVU2Z1RWSGNzU1RsSm52NVYKN3VCMWczVzJZRVloZFJxNlJOUXRZaUFuTktUS2ZYb3d1UUJteWRwVWRYWUljTE5GcER6eHgvRGdQSEhnU0J1dQpQZXVMZzdpemhSSndKMTQ1eW5VTlloQnROVVJaOWlRL1cwWTJOa242UWFBZDNld1pLaVg0S3lZU2k3TTF1MFJWCmFDc1BmZWJrWkRTUnRnQ2Q5N3dGSVYyTVh0UnpXNlpKUUlDWkhHTDVkYkJrNU0xQTI2NnJSYmcvTWZJSE9mdTMKRUZBVjc2aXoyVmNtSDRzblNZUHhBb0lCQVFEc0pNWElhM3ZyRXdRSkh0alRWZE9ONk9rbEExRVN4aWtjSWdSOAo3aFRWQXk3dmtORlpFVUhYczQ1TXlYQzRxTWlvUnFhZHVtOXpQWnFBQ0tQMHRWcXdDMVdOcUFrbDBQc1pZYXcrCmpKNjRDQXA4ZnJ4UDUrOVpWREtiamRWK1ZrK1lrbC9UL0Q1djNFTnZIdkVxN3ZMSE56dE9VSmFWZXNFRERQSW8KaER5SHhjRXQwTHRXTFhoNGNMSDhIQk9Kc0wxYXcxRlhNTk1qdERzazlBMTlJRFlYTHcwaWpIeC81c3hHUGcxSQpmMXRIemhpTlN5NUU5RG9pTmJxVFQvWEEyYVdCdjJ1ZlQybmw2ekticHZHNVo0VGlOUE5ESU5MaUFXOVNNQnJnCkJtaXJFVHU4MnVSa3hnaWZTM01CZ0ZFdXVtaSt2cEhwNzhGaUNOcHpZZUFwTUxjN0FvSUJBUURreVFVT29HVjEKTzZaNXJ4KzhLbVh1S3dmbXNHNmh5cmkrNEw4MzRQakVhbHdkdFhFUmphUG8vSTVhOVFoYjNnLzF5SUdiMzdLSgpPaTFCcGVRZ1owUEVQdFgyRWI0QTNCSTA5SzExWWFybnJGM2d6WS9CVWgveEZoL1YvVEVzTTloZTZ4YlhtRm9WCktvMlY1b2NlNnQzNUJuNHVLL2xkSEJKMHJnUENQdXNKVU9JMEhtUzZkdXNQcHczRFpESkZ5SEU4anptSllwcUsKMnBEMlBBMVZ5aVBBM3MwOU12TWdNSmJXajJLQVBoYk4xQXJnTERaUTFuZ0VwaVFtM3hWdmxIVkMzN0JHM0IzcApWbmtSRE9UZnF1N1BXek40aHZnMDRaNkxBdEZuYzNnMFFxRGcvcXZlS0xuclZwOUJEUlhWb0pZZkNMaVBkajZCCmFiYnFXQ0lYTnMwTkFvSUJBUURFWllrQk9UT2t2UG44UStWOVRzSldJa0hWZ0w2cTZKaEVSNTZIOE5MdW5ta28KNGI3Ylh0anQ5dTRBdXdDKzg5Ris4dE9jRnZTZVdidm5oRWdvTzdTaSthbzcyR2RUUmsyd1BHV3UxL0VoaWI1Kwo4RURhREVJcWZ6WmYzVVNVZ0dCT3VsNXN4anQvZVNlMGdYMStnYUQxUXVCV0wvd3RjaHlZMXVtSC9RTUN3TnY3CnFNQkYyaWQ1cy9Demh2NVE0K2Q0VnoyTlVKUXArN204OENWUHpieHU1N2o2NVBDZXgydFplRDQvNzN3UmFqMU4KTmh2VFNYUVlBNnVhM1VPOUVzYnQ5REFrSFQ0cjlNTHdaWlpnNXRIRCtObmhHS21MUWpvOWxyaWpYWEVyNVhkVAppSkd2cG15Qlg1VFV5TTI4R1ZrSVd5S3I5N1ZVUFp6Qm5jTjdQb01GQW9JQkFDSWRCekFESXAyMFkwSkpwb1c4CkhLN0NvODcyQjhrQUhVUDQ1d3BCOVZYME5nQUlDZkFBR3F5bTIrTWNIajcwZ1pTNGJQcjlBL1lLUXExRE94ekoKeVFUK0NaRkRXLzFzMHhvcVVhTHJDVHk2S3RWV1VWVVdGY1V3ODFaSkJvZjh3d3FFSzBmQ1k4dzhLQmh0NHovcwo3V1F3WDZncXptZmZ3N0M2TWIxSS9HckxNSzlzeU1BMDh4L0dYUHNCZWEyR0VieGg3c1paZVlteXhXS3gyWnN0CkpOK2hXU0VDODlXYzZTRGRDR2J1MngrZHVuRnFwajZ2ZS8zVmVCYUR0UUtLTkdIZ1VMeUFIY1dwS3l3cnJBVGQKeS9ZSE4wbUZkb1VNRDBQVEM3NU5MV005ZkJlUVliZ2lnblpnMkNZdStVNTlQMlVwTzd2SWVkRjZIZGdiaEJuSwpCaEVDZ2dFQkFNZmQ2Zi90RThTQlNFUnd5YW80SThuZkhTZUlMUklvM3pqRE5vWHZ6VHlwbG00a3ovYW9QeEF0CmhPYVNmZU41bFljMXFFUkRxZzRIVGRNTUkyenZPaVFuMHNGTEJFZ0UwT0VIOEZxZVZlZGgycUJucFdXWEhwTW8KREd4TnhpUnVpSDZpOEVMVWFoaU1NQkdQVi9ONjI5MDREbnUyYVVHcHlMTzZxems3SmM5VXlITC90QVNRTFIzagp6NFBhb2xTRE5rNzJSUks0VjIyZUprM2EwYVhjRU5vM1R0OUlTUTliMG5DYVVKbFJsZTA0d2QrOWUyN0FRNUNaCkVWbUtZT1JYcW9VTGNQOEcxRm1VUGhDRkU2aEI3L1hSVWpQdmJFdm5rS05Cdko2UHppT0RMdktRK3I4TzR0WkMKQi9LTDlCdjNmdUkvQlJLeU9WZVU1VnZ5MzUveUFxVT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\",\n \"authentication\": {\n \"server\": [\n {\n \"profile\": \"mTLS authentication profile\"\n }\n ]\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"server\": [\n {\n \"name\": \"mTLS authentication profile\",\n \"type\": \"mtls\",\n \"mtls\": {\n \"certificate\": \"client_cert\",\n \"key\": \"client_key\"\n }\n }\n ]\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nms\": {\n \"url\": \"{{nim_host}}\",\n \"username\": \"{{nim_username}}\",\n \"password\": \"{{nim_password}}\",\n \"instancegroup\": \"{{nim_instancegroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\",\n \"authentication\": {\n \"server\": [\n {\n \"profile\": \"mTLS authentication profile\"\n }\n ]\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"server\": [\n {\n \"name\": \"mTLS authentication profile\",\n \"type\": \"mtls\",\n \"mtls\": {\n \"certificate\": \"client_cert\",\n \"key\": \"client_key\"\n }\n }\n ]\n }\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\",\n \"authentication\": [\n {\n \"profile\": \"Basic authentication profile\"\n }\n ]\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n },\n {\n \"type\": \"certificate\",\n \"name\": \"client_cert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZBakNDQStxZ0F3SUJBZ0lVYXZ1aFhBOWFLVFJlYmZ2Y1BFU2Z0MjBUQXhzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZqRUxNQWtHQTFVRUJoTUNTVVV4RFRBTEJnTlZCQWdNQkVOdmNtc3hEVEFMQmdOVkJBY01CRU52Y21zeApFVEFQQmdOVkJBb01DRUZqYldVZ1RIUmtNUll3RkFZRFZRUUREQTEwWlhOMExtRmpiV1F1YkdGdU1CNFhEVEkwCk1EUXhOVEUzTURnMU0xb1hEVEkxTURReE5URTNNRGcxTTFvd1dERUxNQWtHQTFVRUJoTUNTVVV4RFRBTEJnTlYKQkFnTUJFTnZjbXN4RFRBTEJnTlZCQWNNQkVOdmNtc3hFVEFQQmdOVkJBb01DRUZqYldVZ1RIUmtNUmd3RmdZRApWUVFEREE5amJHbGxiblF1WVdOdFpTNXNZV0l3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUURUQ2kydi8rc08rdTJTcFF5ZVBLM3hnb3RyRUlDZGJYMmN4N0xkcnRDbE82a0xTM3IybWpxV1ptWkQKUWkvL0dIZXhYS3NaelBURDUyN0ZMZlREcExIb2h1MldmeUErQy9HN2JycXlNT0dQZ3lVcEI2NWN2THU4V1BNOApPa3lxVFdma0xkRnF2akFGclU5czMxUnljT3BQSlB0cFloRWlhQXZRWDlwRnhjalM2NUJscUFCMjY1YnlncGs2CmpsV1E5NTVWUzlmZlNLU3hpQTRCQXAzMHV3Rm5YRWtMcGRCenI1TkFKeXJqdXhzbHJGVEs4SGxvRmQ2MndzQUMKRjYrRGZmQ2FNLzVockljRkswSVFheHBpaWUyWllKaVFmNXJMeVd6VG1xMVh1QmsyaEhBWDNvQUY2bW9hcnVNOAo5UlhxQmlaNnFWdGFPQXFEK0pRVGNpYmVzekQ2Z2xoSitGM0VFTEJOWVhETmFLbGprQXRxVWFwYStXZEdVUkU4CnZvczA4TSsvOUlhWTdQeGtQNXB6bDhmaS9RaS9ESW9WLzh0UUlydFBIYzJqSTFSRkZoL3BpeDFsR2lyTlRBK0QKbTlURDJKT0hTU3VmdkRkRnV1YjFwMnF5TW5Nd3FFNklHOGpmTEg2TGNxRGFSbmcveVpVUTBqa01LSFYrd1gwegpkZ1RsMDVVWjZtMFpFNUdlK1FRaG5nY0FUemdrSWp3WlJod1JLOEx1Nmtwb2Vnb0dMUkhkTVNqcUV0NkNWc25BCmFLZ0hTbTJROE9MS1lJdlhVN1RpME9DNm5OdU40RDlKdkxGQXdPMUVFU2tCUXFQeThGby8zRVNZWU1FazJ6RzQKc3I0UXJ4Q2xuY2pwbUMrdkRmdHJuR055SVJvditOeS9zd2FSdkcvcm15ZnhEYVdNL3dJREFRQUJvNEhGTUlIQwpNQWtHQTFVZEV3UUNNQUF3RVFZSllJWklBWWI0UWdFQkJBUURBZ1dnTURNR0NXQ0dTQUdHK0VJQkRRUW1GaVJQCmNHVnVVMU5NSUVkbGJtVnlZWFJsWkNCRGJHbGxiblFnUTJWeWRHbG1hV05oZEdVd0hRWURWUjBPQkJZRUZGQmIKdmltZDYxekxLdlA0U2RZRFRWbndYdFVwTUI4R0ExVWRJd1FZTUJhQUZLY29GRHpMVnc1QXBiMzB5UTM0c25MZQpHQ1FWTUE0R0ExVWREd0VCL3dRRUF3SUY0REFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVICkF3UXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSmg0cm9kZEVGemJwWk5kSW5zUmdubWVnWVIxSWlzUUxRU0IKcmNydEZxVmtLb3Rsc09EUXBFMThIRjBsbVA4WE9IU0hqYytYUVF5YlFNd1ViZ2RNbnhBZE1WaGFaMXppWElnaQpiUHgwOEY0YXR5MElJY1hyOVpFVnZTd1pheURBZHErb2s5RGpoRjQwYU5iQmFBTXB2NTRCL2U3OUNMSWZ6REo4CnNZaWw3K09abWlOUTJtZUNreVBYdXdhd3hTeVRnNVhWS3Q4VEtKQVJ5aTFJeWRHWkZRMTJGWFJHTE1BSjdaYngKRzlPd1ZvazExenpWNkRQZHFuZU5ER3BQRU5WZ2VmVjI0ZU1JVXUrYzhnSThYTU1GMU9VVWR3MmlEQmU4Q01TQQppc2h2aDFWYVZPNC96czlma2dLV2FXejNwQWprN3pkbWdaUnpXRUVHR0JMekJoQk5FQTg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"client_key\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRRFRDaTJ2LytzTyt1MlMKcFF5ZVBLM3hnb3RyRUlDZGJYMmN4N0xkcnRDbE82a0xTM3IybWpxV1ptWkRRaS8vR0hleFhLc1p6UFRENTI3RgpMZlREcExIb2h1MldmeUErQy9HN2JycXlNT0dQZ3lVcEI2NWN2THU4V1BNOE9reXFUV2ZrTGRGcXZqQUZyVTlzCjMxUnljT3BQSlB0cFloRWlhQXZRWDlwRnhjalM2NUJscUFCMjY1YnlncGs2amxXUTk1NVZTOWZmU0tTeGlBNEIKQXAzMHV3Rm5YRWtMcGRCenI1TkFKeXJqdXhzbHJGVEs4SGxvRmQ2MndzQUNGNitEZmZDYU0vNWhySWNGSzBJUQpheHBpaWUyWllKaVFmNXJMeVd6VG1xMVh1QmsyaEhBWDNvQUY2bW9hcnVNODlSWHFCaVo2cVZ0YU9BcUQrSlFUCmNpYmVzekQ2Z2xoSitGM0VFTEJOWVhETmFLbGprQXRxVWFwYStXZEdVUkU4dm9zMDhNKy85SWFZN1B4a1A1cHoKbDhmaS9RaS9ESW9WLzh0UUlydFBIYzJqSTFSRkZoL3BpeDFsR2lyTlRBK0RtOVREMkpPSFNTdWZ2RGRGdXViMQpwMnF5TW5Nd3FFNklHOGpmTEg2TGNxRGFSbmcveVpVUTBqa01LSFYrd1gwemRnVGwwNVVaNm0wWkU1R2UrUVFoCm5nY0FUemdrSWp3WlJod1JLOEx1Nmtwb2Vnb0dMUkhkTVNqcUV0NkNWc25BYUtnSFNtMlE4T0xLWUl2WFU3VGkKME9DNm5OdU40RDlKdkxGQXdPMUVFU2tCUXFQeThGby8zRVNZWU1FazJ6RzRzcjRRcnhDbG5janBtQyt2RGZ0cgpuR055SVJvditOeS9zd2FSdkcvcm15ZnhEYVdNL3dJREFRQUJBb0lDQUJzWEZBK2krRmVFbW5rdE9xdHRUL1FsCk5TUlozL05WYjJuRlcyUGRqRHhKcGtUTzV2VS9qYThVd2ZmTVIrdWxCbWhSWkVmOFBweVBMc2J5USszV29iSjAKUk9JQlprVjdYd2ZDWDdEVUJDc0VtS3ZscDlvN3JVQmJqV0w1SmpJNDhYeDI3VFR0NlFMY05uVXhUZDUxanRPagpXYXFJdzNqNU1Oc0tFdDRncWlET2RhQzIvMzJaekZkTHNHNWdnRmRnUElZOUpYUXN3bHk2VnZjdzVpU0RoTnRICkcyYWxYYXdiL2s1Sk9OWTIyY3RDT0kyUnhPUGtPc3lYRkoxYTBRQStGYmxBWExKenVubE5ZNU9iOXEwWTFpa2sKSHpGeXBUcENSdmY2dzY3em00NUYvZVdkS0MzdmpnM29JK29GUS9vMTJUdjhWV3Bhc0ptSmoraUJ5aFRpOGx4YQpMempXaHNrUFZJUGJDYjFDTmIzZHNQSWVWYTVQYmRORGh2bHBQZFV4cXhKRGI4ZUFhemxSQXJVdmtaQnpkTjZtCjVwekljNGtMQnd3Wno5eGg1MzdsQ0tlZ3ZJYmdEMlQvMEM4SVFsWmFIK1M3azlWaVU2Z1RWSGNzU1RsSm52NVYKN3VCMWczVzJZRVloZFJxNlJOUXRZaUFuTktUS2ZYb3d1UUJteWRwVWRYWUljTE5GcER6eHgvRGdQSEhnU0J1dQpQZXVMZzdpemhSSndKMTQ1eW5VTlloQnROVVJaOWlRL1cwWTJOa242UWFBZDNld1pLaVg0S3lZU2k3TTF1MFJWCmFDc1BmZWJrWkRTUnRnQ2Q5N3dGSVYyTVh0UnpXNlpKUUlDWkhHTDVkYkJrNU0xQTI2NnJSYmcvTWZJSE9mdTMKRUZBVjc2aXoyVmNtSDRzblNZUHhBb0lCQVFEc0pNWElhM3ZyRXdRSkh0alRWZE9ONk9rbEExRVN4aWtjSWdSOAo3aFRWQXk3dmtORlpFVUhYczQ1TXlYQzRxTWlvUnFhZHVtOXpQWnFBQ0tQMHRWcXdDMVdOcUFrbDBQc1pZYXcrCmpKNjRDQXA4ZnJ4UDUrOVpWREtiamRWK1ZrK1lrbC9UL0Q1djNFTnZIdkVxN3ZMSE56dE9VSmFWZXNFRERQSW8KaER5SHhjRXQwTHRXTFhoNGNMSDhIQk9Kc0wxYXcxRlhNTk1qdERzazlBMTlJRFlYTHcwaWpIeC81c3hHUGcxSQpmMXRIemhpTlN5NUU5RG9pTmJxVFQvWEEyYVdCdjJ1ZlQybmw2ekticHZHNVo0VGlOUE5ESU5MaUFXOVNNQnJnCkJtaXJFVHU4MnVSa3hnaWZTM01CZ0ZFdXVtaSt2cEhwNzhGaUNOcHpZZUFwTUxjN0FvSUJBUURreVFVT29HVjEKTzZaNXJ4KzhLbVh1S3dmbXNHNmh5cmkrNEw4MzRQakVhbHdkdFhFUmphUG8vSTVhOVFoYjNnLzF5SUdiMzdLSgpPaTFCcGVRZ1owUEVQdFgyRWI0QTNCSTA5SzExWWFybnJGM2d6WS9CVWgveEZoL1YvVEVzTTloZTZ4YlhtRm9WCktvMlY1b2NlNnQzNUJuNHVLL2xkSEJKMHJnUENQdXNKVU9JMEhtUzZkdXNQcHczRFpESkZ5SEU4anptSllwcUsKMnBEMlBBMVZ5aVBBM3MwOU12TWdNSmJXajJLQVBoYk4xQXJnTERaUTFuZ0VwaVFtM3hWdmxIVkMzN0JHM0IzcApWbmtSRE9UZnF1N1BXek40aHZnMDRaNkxBdEZuYzNnMFFxRGcvcXZlS0xuclZwOUJEUlhWb0pZZkNMaVBkajZCCmFiYnFXQ0lYTnMwTkFvSUJBUURFWllrQk9UT2t2UG44UStWOVRzSldJa0hWZ0w2cTZKaEVSNTZIOE5MdW5ta28KNGI3Ylh0anQ5dTRBdXdDKzg5Ris4dE9jRnZTZVdidm5oRWdvTzdTaSthbzcyR2RUUmsyd1BHV3UxL0VoaWI1Kwo4RURhREVJcWZ6WmYzVVNVZ0dCT3VsNXN4anQvZVNlMGdYMStnYUQxUXVCV0wvd3RjaHlZMXVtSC9RTUN3TnY3CnFNQkYyaWQ1cy9Demh2NVE0K2Q0VnoyTlVKUXArN204OENWUHpieHU1N2o2NVBDZXgydFplRDQvNzN3UmFqMU4KTmh2VFNYUVlBNnVhM1VPOUVzYnQ5REFrSFQ0cjlNTHdaWlpnNXRIRCtObmhHS21MUWpvOWxyaWpYWEVyNVhkVAppSkd2cG15Qlg1VFV5TTI4R1ZrSVd5S3I5N1ZVUFp6Qm5jTjdQb01GQW9JQkFDSWRCekFESXAyMFkwSkpwb1c4CkhLN0NvODcyQjhrQUhVUDQ1d3BCOVZYME5nQUlDZkFBR3F5bTIrTWNIajcwZ1pTNGJQcjlBL1lLUXExRE94ekoKeVFUK0NaRkRXLzFzMHhvcVVhTHJDVHk2S3RWV1VWVVdGY1V3ODFaSkJvZjh3d3FFSzBmQ1k4dzhLQmh0NHovcwo3V1F3WDZncXptZmZ3N0M2TWIxSS9HckxNSzlzeU1BMDh4L0dYUHNCZWEyR0VieGg3c1paZVlteXhXS3gyWnN0CkpOK2hXU0VDODlXYzZTRGRDR2J1MngrZHVuRnFwajZ2ZS8zVmVCYUR0UUtLTkdIZ1VMeUFIY1dwS3l3cnJBVGQKeS9ZSE4wbUZkb1VNRDBQVEM3NU5MV005ZkJlUVliZ2lnblpnMkNZdStVNTlQMlVwTzd2SWVkRjZIZGdiaEJuSwpCaEVDZ2dFQkFNZmQ2Zi90RThTQlNFUnd5YW80SThuZkhTZUlMUklvM3pqRE5vWHZ6VHlwbG00a3ovYW9QeEF0CmhPYVNmZU41bFljMXFFUkRxZzRIVGRNTUkyenZPaVFuMHNGTEJFZ0UwT0VIOEZxZVZlZGgycUJucFdXWEhwTW8KREd4TnhpUnVpSDZpOEVMVWFoaU1NQkdQVi9ONjI5MDREbnUyYVVHcHlMTzZxems3SmM5VXlITC90QVNRTFIzagp6NFBhb2xTRE5rNzJSUks0VjIyZUprM2EwYVhjRU5vM1R0OUlTUTliMG5DYVVKbFJsZTA0d2QrOWUyN0FRNUNaCkVWbUtZT1JYcW9VTGNQOEcxRm1VUGhDRkU2aEI3L1hSVWpQdmJFdm5rS05Cdko2UHppT0RMdktRK3I4TzR0WkMKQi9LTDlCdjNmdUkvQlJLeU9WZVU1VnZ5MzUveUFxVT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -8327,7 +8674,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -8336,7 +8684,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_acme_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"cacert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjekNDQTF1Z0F3SUJBZ0lVVnNRZkFaTW4vazNRTU9nc0RuVEdUaU9PbGJ3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TURrMU5EQTRXaGNOCk1qUXdOakEzTURrMU5EQTRXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMlQwWXpkcjB0dWQzaVJRNGNzaGNhRVJTRzVjTDE2CkhRblhoYWw4emlUL1VRQUNIUGdzZDYwcWlEaldvQTJXb0lGWFFpUHkzOG1vZGtWRlR4Qmt5U2VldndOOFJiLzEKOFhaMS8yS1RnVmRDcHkvNm11WE15bXZYODJad05CVkV3QnoxUk5kbklUSk44cVh3a0d4bHozbDBib1loRkFyUQpNdmkxcW1RaHpDa2Zpb041MVkrYlBXOXpTQlFQdXNrcXJYYzRqTTJ0VENNQ2pTcFlvd1hXM1ppRmc5WEJ1Z09aCjFmdWd1Zmw4K1FJYzNZSEFoL1Z1NloraXFEOGxQeGRKODlBeDZaazVtOGdkVG9JdUhBbUNWaHFpUXBGRjkzSTgKbkYrSnRuYnBaNTRJUTZBbWYrYiswakMxdmY4Kzg0WUppaEVzWExyaGMxZTRTZ2dwdzEvcWpDb21QblhGVjEzUwpsUG5kVlhVR0taa1ZKdXdZTjJyZElmd3YrdCs5MGhwUVBmNmFBTjRCamRxOXdkdkQzSXVnS2JYZG5CQ0FUTEY4ClYyRTFTSE9VZGdRY3duK1d1WDVVOGdPa3B2b2VFN0g1REJ6Rks1WTZ2SHZlaTRlNkp3RTRDK3FJL1BmbTgreTEKNEpsOFBSOW5JQmdGQ3hrZWpwa2tRQ0I5U0dvMVZidzZhWmdZd0VQNHh6YXFYYXV3L3F4c0oxNUkrRTBndEs1OApuWUtkM0hqelk5Slh6V0NVNTdXbmc2SzNvTTIzNXpyRzJnNm1FaHQ4SStDckVMUFNuZURjZU8zVlJkc2dlblBCCis4U1JxVU8vWG9LWHNEU3I5amoxdWluVzYwTG5MZ0Zmc3JQeGlQVlZlMFh1TFZESlhCSlNoRDZDeGRyMnBSOGQKS25SRDZrTFpZZEtMQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqVwpWREFmQmdOVkhTTUVHREFXZ0JRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqV1ZEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJad3B4Z2Z4N2thZFhvRHNyT1hUVXJ6dEFPMkFQRVJNaTAKaTkyNk9DTGFPbVVYZW1uKytXSUU1K2tUSE0wcS8vbUZCTURzSmdZSFVLUlNvRGNsNmh4TnVFNUNzS2trRVFTSgpMTHZrWlB0S2J5NGlxMitLZ1JtdVZxbXJNVTBYQzZMZDl3WmttL2huUjNtT3V6bko4MGZmV1JDQ0xGWDEwY2EzCnc5TGM1d1JLTFBZZXQvcEs5SitOYWN3TFJRYTczVFovMUpQNW9BU3czVjNoYkxlLy9UeWpnOURqUlZGY3FYWnEKWWs2Mm5qSkhZVzh3WmlhZzc0QXU4dHE5OG5KandBV1ROMFV5L2w1Q2VpWnV5bzZlU0RHVDNJNm1BdGU1VXBvWAppNXBkYlZ6VDdOZC9IOEwwZHZNdVZ2N0FmakZlcU91cUZNNkkzTnlvbStLWENxNmJQdGxBWEkzeVFZc0t4ZlRkCkw3SnRaTmx6MGJ6eHJhcHI4RmpYcjhML1ZkeHQza00xMnJwb2kzL3hsckR6Q2Q2b2YrQ1MxelBocUdpOUhvcUoKZEU5VGhYMklTdkd2akVSYzVVNFRsNjJBNHNyeGJQbUt0eWx3dGNGVEJacUJiRGY3ZjBBc2cveWhndXdTcktsQQpBNkRWVXVCRFErdGpwZ0N0b0ZlOEhLVDJ6UFVlaEQ2ZjVNQkhmU2ZUZ1crTlhFSXNvVDNsampjY1hsYXhPcFJWCkNQNWxCczNmekxyYnBxbUlLaWZhdWlTNWM4TzlSUjhjQTVzeWlBOTBmbmJIdDlmdGxpRG9jcFRzNUtrbjk2NkIKZUxMM1dXVldCYUtvanJzY1RkVXJoalNnVVBmam5FTXpnVzR2eEc3d3BVNHR2ME4yaEtHUWc0bVhhcDV0SU5Pcwp4WktnZXRHUldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"resolver\": \"Google\",\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"acme_issuer\": \"ACME example issuer\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"acme_issuers\": [\n {\n \"name\": \"ACME example issuer\",\n \"uri\": \"https://acme.example.com/directory\",\n \"contact\": \"admin@example.test\",\n \"account_key\": \"rsa:2048\",\n \"ssl_verify\": true,\n \"ssl_trusted_certificate\": \"cacert\",\n \"accept_terms_of_service\": true\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_acme_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"resolver\": \"Google\",\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"acme_issuer\": \"ACME example issuer\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"acme_issuers\": [\n {\n \"name\": \"ACME example issuer\",\n \"uri\": \"https://acme.example.com/directory\",\n \"contact\": \"admin@example.test\",\n \"account_key\": \"rsa:2048\",\n \"ssl_verify\": true,\n \"ssl_trusted_certificate\": \"cacert\",\n \"accept_terms_of_service\": true\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"cacert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjekNDQTF1Z0F3SUJBZ0lVVnNRZkFaTW4vazNRTU9nc0RuVEdUaU9PbGJ3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TURrMU5EQTRXaGNOCk1qUXdOakEzTURrMU5EQTRXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMlQwWXpkcjB0dWQzaVJRNGNzaGNhRVJTRzVjTDE2CkhRblhoYWw4emlUL1VRQUNIUGdzZDYwcWlEaldvQTJXb0lGWFFpUHkzOG1vZGtWRlR4Qmt5U2VldndOOFJiLzEKOFhaMS8yS1RnVmRDcHkvNm11WE15bXZYODJad05CVkV3QnoxUk5kbklUSk44cVh3a0d4bHozbDBib1loRkFyUQpNdmkxcW1RaHpDa2Zpb041MVkrYlBXOXpTQlFQdXNrcXJYYzRqTTJ0VENNQ2pTcFlvd1hXM1ppRmc5WEJ1Z09aCjFmdWd1Zmw4K1FJYzNZSEFoL1Z1NloraXFEOGxQeGRKODlBeDZaazVtOGdkVG9JdUhBbUNWaHFpUXBGRjkzSTgKbkYrSnRuYnBaNTRJUTZBbWYrYiswakMxdmY4Kzg0WUppaEVzWExyaGMxZTRTZ2dwdzEvcWpDb21QblhGVjEzUwpsUG5kVlhVR0taa1ZKdXdZTjJyZElmd3YrdCs5MGhwUVBmNmFBTjRCamRxOXdkdkQzSXVnS2JYZG5CQ0FUTEY4ClYyRTFTSE9VZGdRY3duK1d1WDVVOGdPa3B2b2VFN0g1REJ6Rks1WTZ2SHZlaTRlNkp3RTRDK3FJL1BmbTgreTEKNEpsOFBSOW5JQmdGQ3hrZWpwa2tRQ0I5U0dvMVZidzZhWmdZd0VQNHh6YXFYYXV3L3F4c0oxNUkrRTBndEs1OApuWUtkM0hqelk5Slh6V0NVNTdXbmc2SzNvTTIzNXpyRzJnNm1FaHQ4SStDckVMUFNuZURjZU8zVlJkc2dlblBCCis4U1JxVU8vWG9LWHNEU3I5amoxdWluVzYwTG5MZ0Zmc3JQeGlQVlZlMFh1TFZESlhCSlNoRDZDeGRyMnBSOGQKS25SRDZrTFpZZEtMQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqVwpWREFmQmdOVkhTTUVHREFXZ0JRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqV1ZEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJad3B4Z2Z4N2thZFhvRHNyT1hUVXJ6dEFPMkFQRVJNaTAKaTkyNk9DTGFPbVVYZW1uKytXSUU1K2tUSE0wcS8vbUZCTURzSmdZSFVLUlNvRGNsNmh4TnVFNUNzS2trRVFTSgpMTHZrWlB0S2J5NGlxMitLZ1JtdVZxbXJNVTBYQzZMZDl3WmttL2huUjNtT3V6bko4MGZmV1JDQ0xGWDEwY2EzCnc5TGM1d1JLTFBZZXQvcEs5SitOYWN3TFJRYTczVFovMUpQNW9BU3czVjNoYkxlLy9UeWpnOURqUlZGY3FYWnEKWWs2Mm5qSkhZVzh3WmlhZzc0QXU4dHE5OG5KandBV1ROMFV5L2w1Q2VpWnV5bzZlU0RHVDNJNm1BdGU1VXBvWAppNXBkYlZ6VDdOZC9IOEwwZHZNdVZ2N0FmakZlcU91cUZNNkkzTnlvbStLWENxNmJQdGxBWEkzeVFZc0t4ZlRkCkw3SnRaTmx6MGJ6eHJhcHI4RmpYcjhML1ZkeHQza00xMnJwb2kzL3hsckR6Q2Q2b2YrQ1MxelBocUdpOUhvcUoKZEU5VGhYMklTdkd2akVSYzVVNFRsNjJBNHNyeGJQbUt0eWx3dGNGVEJacUJiRGY3ZjBBc2cveWhndXdTcktsQQpBNkRWVXVCRFErdGpwZ0N0b0ZlOEhLVDJ6UFVlaEQ2ZjVNQkhmU2ZUZ1crTlhFSXNvVDNsampjY1hsYXhPcFJWCkNQNWxCczNmekxyYnBxbUlLaWZhdWlTNWM4TzlSUjhjQTVzeWlBOTBmbmJIdDlmdGxpRG9jcFRzNUtrbjk2NkIKZUxMM1dXVldCYUtvanJzY1RkVXJoalNnVVBmam5FTXpnVzR2eEc3d3BVNHR2ME4yaEtHUWc0bVhhcDV0SU5Pcwp4WktnZXRHUldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -8539,38 +8887,130 @@ "path": [ "{{ngc_api_version}}", "config", - "{{configUid}}" + "{{configUid}}" + ] + } + }, + "response": [] + }, + { + "name": "3. Publish application - random joke", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "tests[\"submissionUid is: \" + respData.submissionUid] = respData.submissionUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);", + "pm.collectionVariables.set('submissionUid2',respData.submissionUid);" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"synchronous\": false,\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\"\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": true\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Random joke application\",\n \"names\": [\n \"randomjoke.vm-blank.ie.ff.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/joke-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/joke-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://randomjoke-upstream\"\n }\n ],\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"official-joke-api.appspot.com\"\n }\n ]\n }\n }\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"randomjoke-upstream\",\n \"origin\": [\n {\n \"server\": \"official-joke-api.appspot.com\"\n }\n ]\n }\n ]\n }\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config", + "{{configUid}}" + ] + } + }, + "response": [] + }, + { + "name": "4a. Get asynchronous submission status - echo test", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}/submission/{{submissionUid1}}", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config", + "{{configUid}}", + "submission", + "{{submissionUid1}}" ] } }, "response": [] }, { - "name": "3. Publish application - random joke", + "name": "4b. Get asynchronous submission status - random joke", "event": [ { "listen": "test", "script": { "exec": [ - "var respData = JSON.parse(responseBody);", - "", - "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", - "tests[\"submissionUid is: \" + respData.submissionUid] = respData.submissionUid;", - "", - "pm.collectionVariables.set('configUid',respData.configUid);", - "pm.collectionVariables.set('submissionUid2',respData.submissionUid);" + "" ], "type": "text/javascript", "packages": {} } } ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, "request": { - "method": "PATCH", + "method": "GET", "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"synchronous\": false,\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\"\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": true\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Random joke application\",\n \"names\": [\n \"randomjoke.vm-blank.ie.ff.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:80\"\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/joke-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/joke-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://randomjoke-upstream\"\n }\n ],\n \"headers\": {\n \"to_server\": {\n \"set\": [\n {\n \"name\": \"Host\",\n \"value\": \"official-joke-api.appspot.com\"\n }\n ]\n }\n }\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"randomjoke-upstream\",\n \"origin\": [\n {\n \"server\": \"official-joke-api.appspot.com\"\n }\n ]\n }\n ]\n }\n }\n}", + "raw": "", "options": { "raw": { "language": "json" @@ -8578,7 +9018,7 @@ } }, "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}/submission/{{submissionUid2}}", "protocol": "http", "host": [ "{{ncg_host}}" @@ -8587,14 +9027,16 @@ "path": [ "{{ngc_api_version}}", "config", - "{{configUid}}" + "{{configUid}}", + "submission", + "{{submissionUid2}}" ] } }, "response": [] }, { - "name": "4a. Get asynchronous submission status - echo test", + "name": "5. Get declaration", "event": [ { "listen": "test", @@ -8602,8 +9044,7 @@ "exec": [ "" ], - "type": "text/javascript", - "packages": {} + "type": "text/javascript" } } ], @@ -8620,163 +9061,354 @@ "raw": { "language": "json" } - } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config", + "{{configUid}}" + ] + } + }, + "response": [] + }, + { + "name": "6. Test application - echo test", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://echo.vm-blank.ie.ff.lan", + "protocol": "http", + "host": [ + "echo", + "vm-blank", + "ie", + "ff", + "lan" + ] + } + }, + "response": [] + }, + { + "name": "7. Test application - random joke", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://randomjoke.vm-blank.ie.ff.lan/random_joke", + "protocol": "http", + "host": [ + "randomjoke", + "vm-blank", + "ie", + "ff", + "lan" + ], + "path": [ + "random_joke" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "API Gateway", + "item": [ + { + "name": "APIs.guru", + "item": [ + { + "name": "API Client test requests", + "item": [ + { + "name": "Metrics", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/apiguru/metrics.json", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "apiguru", + "metrics.json" + ] + } + }, + "response": [] + }, + { + "name": "Providers - no authentication", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/apiguru/providers.json", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "apiguru", + "providers.json" + ] + } + }, + "response": [] + }, + { + "name": "Providers - auth with \"DevOps\" token", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/apiguru/providers.json", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "apiguru", + "providers.json" + ] + } + }, + "response": [] + }, + { + "name": "Providers - auth with \"Guest\" token", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDk3NjQ3NTMsImV4cCI6MTcwOTc2NDc1NH0.eyJuYW1lIjoiQWxpY2UgR3Vlc3QiLCJzdWIiOiJKV1Qgc3ViIGNsYWltIiwiaXNzIjoiSldUIGlzcyBjbGFpbSIsInJvbGVzIjpbImd1ZXN0Il19.jFJDq-33irz7uFxdI8c8fIb5TwTAU5BlemmIFVALUAE", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/apiguru/providers.json", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "apiguru", + "providers.json" + ] + } + }, + "response": [] + }, + { + "name": "Providers - auth with \"DevOps\" and \"Guest\" token", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDk3NjQ3NTMsImV4cCI6MTcwOTc2NDc1NH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIiwiZ3Vlc3QiXX0.3ES7aVquklWqlZ4OWzt8rBz5px4kKZRgvifFVNomCsU", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://apigw.nginx.lab/apiguru/providers.json", + "protocol": "https", + "host": [ + "apigw", + "nginx", + "lab" + ], + "path": [ + "apiguru", + "providers.json" + ] + } + }, + "response": [] + } + ], + "description": "This folder contains requests to access the Petstore API published through NGINX using the Declarative API" + }, + { + "name": "APIGuru API Gateway RateLimit + JWT AuthN/AuthZ + redocly - YAML OpenAPI schema", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"APIGuru\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/apiguru\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://api.apis.guru/v2/openapi.yaml\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://api.apis.guru/v2/\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/apiguru-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"apigw_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/metrics.json\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"apigw_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"API Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config" + ] + } + }, + "response": [] }, - "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}/submission/{{submissionUid1}}", - "protocol": "http", - "host": [ - "{{ncg_host}}" - ], - "port": "{{ncg_port}}", - "path": [ - "{{ngc_api_version}}", - "config", - "{{configUid}}", - "submission", - "{{submissionUid1}}" - ] - } - }, - "response": [] - }, - { - "name": "4b. Get asynchronous submission status - random joke", - "event": [ { - "listen": "test", - "script": { - "exec": [ - "" - ], - "type": "text/javascript", - "packages": {} - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "", - "options": { - "raw": { - "language": "json" + "name": "APIGuru API Gateway RateLimit + JWT AuthN/AuthZ + redocly - local OpenAPI schema", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } } - } - }, - "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}/submission/{{submissionUid2}}", - "protocol": "http", - "host": [ - "{{ncg_host}}" ], - "port": "{{ncg_port}}", - "path": [ - "{{ngc_api_version}}", - "config", - "{{configUid}}", - "submission", - "{{submissionUid2}}" - ] - } - }, - "response": [] - }, - { - "name": "5. Get declaration", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "", - "options": { - "raw": { - "language": "json" + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"APIGuru\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/apiguru\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"eyJvcGVuYXBpIjoiMy4wLjAiLCJ4LW9wdGljLXVybCI6Imh0dHBzOi8vYXBwLnVzZW9wdGljLmNvbS9vcmdhbml6YXRpb25zL2ZlYmY4YWM2LWVlNjctNDU2NS1iNDVhLTVjODVhNDY5ZGNhNy9hcGlzL18wZktXcVV2aHM5c3NZTmtxMWstYyIsIngtb3B0aWMtc3RhbmRhcmQiOiJAZmViZjhhYzYtZWU2Ny00NTY1LWI0NWEtNWM4NWE0NjlkY2E3L0Z6NktVM193TUlPNWlKNl9WVVozMCIsImluZm8iOnsidmVyc2lvbiI6IjIuMi4wIiwidGl0bGUiOiJBUElzLmd1cnUiLCJkZXNjcmlwdGlvbiI6Ildpa2lwZWRpYSBmb3IgV2ViIEFQSXMuIFJlcG9zaXRvcnkgb2YgQVBJIGRlZmluaXRpb25zIGluIE9wZW5BUEkgZm9ybWF0LlxuKipXYXJuaW5nKio6IElmIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIGFib3V0IGNoYW5nZXMgaW4gYWR2YW5jZSBwbGVhc2Ugam9pbiBvdXIgW1NsYWNrIGNoYW5uZWxdKGh0dHBzOi8vam9pbi5zbGFjay5jb20vdC9tZXJtYWRlL3NoYXJlZF9pbnZpdGUvenQtZzc4Zzd4aXItTUxFX0NUQ2NYQ2RmSmZHM0NKZTlxQSkuXG5DbGllbnQgc2FtcGxlOiBbW0RlbW9dXShodHRwczovL2FwaXMuZ3VydS9zaW1wbGUtdWkpIFtbUmVwb11dKGh0dHBzOi8vZ2l0aHViLmNvbS9BUElzLWd1cnUvc2ltcGxlLXVpKVxuIiwiY29udGFjdCI6eyJuYW1lIjoiQVBJcy5ndXJ1IiwidXJsIjoiaHR0cHM6Ly9BUElzLmd1cnUiLCJlbWFpbCI6Im1pa2UucmFscGhzb25AZ21haWwuY29tIn0sImxpY2Vuc2UiOnsibmFtZSI6IkNDMCAxLjAiLCJ1cmwiOiJodHRwczovL2dpdGh1Yi5jb20vQVBJcy1ndXJ1L29wZW5hcGktZGlyZWN0b3J5I2xpY2Vuc2VzIn0sIngtbG9nbyI6eyJ1cmwiOiJodHRwczovL2FwaXMuZ3VydS9icmFuZGluZy9sb2dvX3ZlcnRpY2FsLnN2ZyJ9fSwiZXh0ZXJuYWxEb2NzIjp7InVybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9BUElzLWd1cnUvb3BlbmFwaS1kaXJlY3RvcnkvYmxvYi9tYXN0ZXIvQVBJLm1kIn0sInNlcnZlcnMiOlt7InVybCI6Imh0dHBzOi8vYXBpLmFwaXMuZ3VydS92MiJ9XSwic2VjdXJpdHkiOltdLCJ0YWdzIjpbeyJuYW1lIjoiQVBJcyIsImRlc2NyaXB0aW9uIjoiQWN0aW9ucyByZWxhdGluZyB0byBBUElzIGluIHRoZSBjb2xsZWN0aW9uIn1dLCJwYXRocyI6eyIvcHJvdmlkZXJzLmpzb24iOnsiZ2V0Ijp7Im9wZXJhdGlvbklkIjoiZ2V0UHJvdmlkZXJzIiwidGFncyI6WyJBUElzIl0sInN1bW1hcnkiOiJMaXN0IGFsbCBwcm92aWRlcnMiLCJkZXNjcmlwdGlvbiI6Ikxpc3QgYWxsIHRoZSBwcm92aWRlcnMgaW4gdGhlIGRpcmVjdG9yeVxuIiwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyJ0eXBlIjoib2JqZWN0IiwicHJvcGVydGllcyI6eyJkYXRhIjp7InR5cGUiOiJhcnJheSIsIml0ZW1zIjp7InR5cGUiOiJzdHJpbmciLCJtaW5MZW5ndGgiOjF9LCJtaW5JdGVtcyI6MX19fX19fX19fSwiL3twcm92aWRlcn0uanNvbiI6eyJnZXQiOnsib3BlcmF0aW9uSWQiOiJnZXRQcm92aWRlciIsInRhZ3MiOlsiQVBJcyJdLCJzdW1tYXJ5IjoiTGlzdCBhbGwgQVBJcyBmb3IgYSBwYXJ0aWN1bGFyIHByb3ZpZGVyIiwiZGVzY3JpcHRpb24iOiJMaXN0IGFsbCBBUElzIGluIHRoZSBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBwcm92aWRlck5hbWVcblJldHVybnMgbGlua3MgdG8gdGhlIGluZGl2aWR1YWwgQVBJIGVudHJ5IGZvciBlYWNoIEFQSS5cbiIsInBhcmFtZXRlcnMiOlt7IiRyZWYiOiIjL2NvbXBvbmVudHMvcGFyYW1ldGVycy9wcm92aWRlciJ9XSwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyIkcmVmIjoiIy9jb21wb25lbnRzL3NjaGVtYXMvQVBJcyJ9fX19fX19LCIve3Byb3ZpZGVyfS9zZXJ2aWNlcy5qc29uIjp7ImdldCI6eyJvcGVyYXRpb25JZCI6ImdldFNlcnZpY2VzIiwidGFncyI6WyJBUElzIl0sInN1bW1hcnkiOiJMaXN0IGFsbCBzZXJ2aWNlTmFtZXMgZm9yIGEgcGFydGljdWxhciBwcm92aWRlciIsImRlc2NyaXB0aW9uIjoiTGlzdCBhbGwgc2VydmljZU5hbWVzIGluIHRoZSBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBwcm92aWRlck5hbWVcbiIsInBhcmFtZXRlcnMiOlt7IiRyZWYiOiIjL2NvbXBvbmVudHMvcGFyYW1ldGVycy9wcm92aWRlciJ9XSwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyJ0eXBlIjoib2JqZWN0IiwicHJvcGVydGllcyI6eyJkYXRhIjp7InR5cGUiOiJhcnJheSIsIml0ZW1zIjp7InR5cGUiOiJzdHJpbmciLCJtaW5MZW5ndGgiOjB9LCJtaW5JdGVtcyI6MX19fX19fX19fSwiL3NwZWNzL3twcm92aWRlcn0ve2FwaX0uanNvbiI6eyJnZXQiOnsib3BlcmF0aW9uSWQiOiJnZXRBUEkiLCJ0YWdzIjpbIkFQSXMiXSwic3VtbWFyeSI6IlJldHJpZXZlIG9uZSB2ZXJzaW9uIG9mIGEgcGFydGljdWxhciBBUEkiLCJkZXNjcmlwdGlvbiI6IlJldHVybnMgdGhlIEFQSSBlbnRyeSBmb3Igb25lIHNwZWNpZmljIHZlcnNpb24gb2YgYW4gQVBJIHdoZXJlIHRoZXJlIGlzIG5vIHNlcnZpY2VOYW1lLiIsInBhcmFtZXRlcnMiOlt7IiRyZWYiOiIjL2NvbXBvbmVudHMvcGFyYW1ldGVycy9wcm92aWRlciJ9LHsiJHJlZiI6IiMvY29tcG9uZW50cy9wYXJhbWV0ZXJzL2FwaSJ9XSwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyIkcmVmIjoiIy9jb21wb25lbnRzL3NjaGVtYXMvQVBJIn19fX19fX0sIi9zcGVjcy97cHJvdmlkZXJ9L3tzZXJ2aWNlfS97YXBpfS5qc29uIjp7ImdldCI6eyJvcGVyYXRpb25JZCI6ImdldFNlcnZpY2VBUEkiLCJ0YWdzIjpbIkFQSXMiXSwic3VtbWFyeSI6IlJldHJpZXZlIG9uZSB2ZXJzaW9uIG9mIGEgcGFydGljdWxhciBBUEkgd2l0aCBhIHNlcnZpY2VOYW1lLiIsImRlc2NyaXB0aW9uIjoiUmV0dXJucyB0aGUgQVBJIGVudHJ5IGZvciBvbmUgc3BlY2lmaWMgdmVyc2lvbiBvZiBhbiBBUEkgd2hlcmUgdGhlcmUgaXMgYSBzZXJ2aWNlTmFtZS4iLCJwYXJhbWV0ZXJzIjpbeyIkcmVmIjoiIy9jb21wb25lbnRzL3BhcmFtZXRlcnMvcHJvdmlkZXIifSx7Im5hbWUiOiJzZXJ2aWNlIiwiaW4iOiJwYXRoIiwicmVxdWlyZWQiOnRydWUsInNjaGVtYSI6eyJ0eXBlIjoic3RyaW5nIiwibWluTGVuZ3RoIjoxLCJtYXhMZW5ndGgiOjI1NSwiZXhhbXBsZSI6ImdyYXBoIn19LHsiJHJlZiI6IiMvY29tcG9uZW50cy9wYXJhbWV0ZXJzL2FwaSJ9XSwicmVzcG9uc2VzIjp7IjIwMCI6eyJkZXNjcmlwdGlvbiI6Ik9LIiwiY29udGVudCI6eyJhcHBsaWNhdGlvbi9qc29uIjp7InNjaGVtYSI6eyIkcmVmIjoiIy9jb21wb25lbnRzL3NjaGVtYXMvQVBJIn19fX19fX0sIi9saXN0Lmpzb24iOnsiZ2V0Ijp7Im9wZXJhdGlvbklkIjoibGlzdEFQSXMiLCJ0YWdzIjpbIkFQSXMiXSwic3VtbWFyeSI6Ikxpc3QgYWxsIEFQSXMiLCJkZXNjcmlwdGlvbiI6Ikxpc3QgYWxsIEFQSXMgaW4gdGhlIGRpcmVjdG9yeS5cblJldHVybnMgbGlua3MgdG8gdGhlIE9wZW5BUEkgZGVmaW5pdGlvbnMgZm9yIGVhY2ggQVBJIGluIHRoZSBkaXJlY3RvcnkuXG5JZiBBUEkgZXhpc3QgaW4gbXVsdGlwbGUgdmVyc2lvbnMgYHByZWZlcnJlZGAgb25lIGlzIGV4cGxpY2l0bHkgbWFya2VkLlxuU29tZSBiYXNpYyBpbmZvIGZyb20gdGhlIE9wZW5BUEkgZGVmaW5pdGlvbiBpcyBjYWNoZWQgaW5zaWRlIGVhY2ggb2JqZWN0LlxuVGhpcyBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIHNvbWUgc2ltcGxlIHZpZXdzIHdpdGhvdXQgbmVlZGluZyB0byBmZXRjaCB0aGUgT3BlbkFQSSBkZWZpbml0aW9uIGZvciBlYWNoIEFQSS5cbiIsInJlc3BvbnNlcyI6eyIyMDAiOnsiZGVzY3JpcHRpb24iOiJPSyIsImNvbnRlbnQiOnsiYXBwbGljYXRpb24vanNvbiI6eyJzY2hlbWEiOnsiJHJlZiI6IiMvY29tcG9uZW50cy9zY2hlbWFzL0FQSXMifX19fX19fSwiL21ldHJpY3MuanNvbiI6eyJnZXQiOnsib3BlcmF0aW9uSWQiOiJnZXRNZXRyaWNzIiwic3VtbWFyeSI6IkdldCBiYXNpYyBtZXRyaWNzIiwiZGVzY3JpcHRpb24iOiJTb21lIGJhc2ljIG1ldHJpY3MgZm9yIHRoZSBlbnRpcmUgZGlyZWN0b3J5LlxuSnVzdCBzdHVubmluZyBudW1iZXJzIHRvIHB1dCBvbiBhIGZyb250IHBhZ2UgYW5kIGFyZSBpbnRlbmRlZCBwdXJlbHkgZm9yIFdvVyBlZmZlY3QgOilcbiIsInRhZ3MiOlsiQVBJcyJdLCJyZXNwb25zZXMiOnsiMjAwIjp7ImRlc2NyaXB0aW9uIjoiT0siLCJjb250ZW50Ijp7ImFwcGxpY2F0aW9uL2pzb24iOnsic2NoZW1hIjp7IiRyZWYiOiIjL2NvbXBvbmVudHMvc2NoZW1hcy9NZXRyaWNzIn19fX19fX19LCJjb21wb25lbnRzIjp7InNjaGVtYXMiOnsiQVBJcyI6eyJkZXNjcmlwdGlvbiI6Ikxpc3Qgb2YgQVBJIGRldGFpbHMuXG5JdCBpcyBhIEpTT04gb2JqZWN0IHdpdGggQVBJIElEcyhgPHByb3ZpZGVyPls6PHNlcnZpY2U+XWApIGFzIGtleXMuXG4iLCJ0eXBlIjoib2JqZWN0IiwiYWRkaXRpb25hbFByb3BlcnRpZXMiOnsiJHJlZiI6IiMvY29tcG9uZW50cy9zY2hlbWFzL0FQSSJ9LCJtaW5Qcm9wZXJ0aWVzIjoxLCJleGFtcGxlIjp7Imdvb2dsZWFwaXMuY29tOmRyaXZlIjp7ImFkZGVkIjoiMjAxNS0wMi0yMlQyMDowMDo0NS4wMDBaIiwicHJlZmVycmVkIjoidjMiLCJ2ZXJzaW9ucyI6eyJ2MiI6eyJhZGRlZCI6IjIwMTUtMDItMjJUMjA6MDA6NDUuMDAwWiIsImluZm8iOnsidGl0bGUiOiJEcml2ZSIsInZlcnNpb24iOiJ2MiIsIngtYXBpQ2xpZW50UmVnaXN0cmF0aW9uIjp7InVybCI6Imh0dHBzOi8vY29uc29sZS5kZXZlbG9wZXJzLmdvb2dsZS5jb20ifSwieC1sb2dvIjp7InVybCI6Imh0dHBzOi8vYXBpLmFwaXMuZ3VydS92Mi9jYWNoZS9sb2dvL2h0dHBzX3d3dy5nc3RhdGljLmNvbV9pbWFnZXNfaWNvbnNfbWF0ZXJpYWxfcHJvZHVjdF8yeF9kcml2ZV8zMmRwLnBuZyJ9LCJ4LW9yaWdpbiI6eyJmb3JtYXQiOiJnb29nbGUiLCJ1cmwiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kaXNjb3ZlcnkvdjEvYXBpcy9kcml2ZS92Mi9yZXN0IiwidmVyc2lvbiI6InYxIn0sIngtcHJlZmVycmVkIjpmYWxzZSwieC1wcm92aWRlck5hbWUiOiJnb29nbGVhcGlzLmNvbSIsIngtc2VydmljZU5hbWUiOiJkcml2ZSJ9LCJzd2FnZ2VyVXJsIjoiaHR0cHM6Ly9hcGkuYXBpcy5ndXJ1L3YyL3NwZWNzL2dvb2dsZWFwaXMuY29tL2RyaXZlL3YyL3N3YWdnZXIuanNvbiIsInN3YWdnZXJZYW1sVXJsIjoiaHR0cHM6Ly9hcGkuYXBpcy5ndXJ1L3YyL3NwZWNzL2dvb2dsZWFwaXMuY29tL2RyaXZlL3YyL3N3YWdnZXIueWFtbCIsInVwZGF0ZWQiOiIyMDE2LTA2LTE3VDAwOjIxOjQ0LjAwMFoifSwidjMiOnsiYWRkZWQiOiIyMDE1LTEyLTEyVDAwOjI1OjEzLjAwMFoiLCJpbmZvIjp7InRpdGxlIjoiRHJpdmUiLCJ2ZXJzaW9uIjoidjMiLCJ4LWFwaUNsaWVudFJlZ2lzdHJhdGlvbiI6eyJ1cmwiOiJodHRwczovL2NvbnNvbGUuZGV2ZWxvcGVycy5nb29nbGUuY29tIn0sIngtbG9nbyI6eyJ1cmwiOiJodHRwczovL2FwaS5hcGlzLmd1cnUvdjIvY2FjaGUvbG9nby9odHRwc193d3cuZ3N0YXRpYy5jb21faW1hZ2VzX2ljb25zX21hdGVyaWFsX3Byb2R1Y3RfMnhfZHJpdmVfMzJkcC5wbmcifSwieC1vcmlnaW4iOnsiZm9ybWF0IjoiZ29vZ2xlIiwidXJsIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZGlzY292ZXJ5L3YxL2FwaXMvZHJpdmUvdjMvcmVzdCIsInZlcnNpb24iOiJ2MSJ9LCJ4LXByZWZlcnJlZCI6dHJ1ZSwieC1wcm92aWRlck5hbWUiOiJnb29nbGVhcGlzLmNvbSIsIngtc2VydmljZU5hbWUiOiJkcml2ZSJ9LCJzd2FnZ2VyVXJsIjoiaHR0cHM6Ly9hcGkuYXBpcy5ndXJ1L3YyL3NwZWNzL2dvb2dsZWFwaXMuY29tL2RyaXZlL3YzL3N3YWdnZXIuanNvbiIsInN3YWdnZXJZYW1sVXJsIjoiaHR0cHM6Ly9hcGkuYXBpcy5ndXJ1L3YyL3NwZWNzL2dvb2dsZWFwaXMuY29tL2RyaXZlL3YzL3N3YWdnZXIueWFtbCIsInVwZGF0ZWQiOiIyMDE2LTA2LTE3VDAwOjIxOjQ0LjAwMFoifX19fX0sIkFQSSI6eyJkZXNjcmlwdGlvbiI6Ik1ldGEgaW5mb3JtYXRpb24gYWJvdXQgQVBJIiwidHlwZSI6Im9iamVjdCIsInJlcXVpcmVkIjpbImFkZGVkIiwicHJlZmVycmVkIiwidmVyc2lvbnMiXSwicHJvcGVydGllcyI6eyJhZGRlZCI6eyJkZXNjcmlwdGlvbiI6IlRpbWVzdGFtcCB3aGVuIHRoZSBBUEkgd2FzIGZpcnN0IGFkZGVkIHRvIHRoZSBkaXJlY3RvcnkiLCJ0eXBlIjoic3RyaW5nIiwiZm9ybWF0IjoiZGF0ZS10aW1lIn0sInByZWZlcnJlZCI6eyJkZXNjcmlwdGlvbiI6IlJlY29tbWVuZGVkIHZlcnNpb24iLCJ0eXBlIjoic3RyaW5nIn0sInZlcnNpb25zIjp7ImRlc2NyaXB0aW9uIjoiTGlzdCBvZiBzdXBwb3J0ZWQgdmVyc2lvbnMgb2YgdGhlIEFQSSIsInR5cGUiOiJvYmplY3QiLCJhZGRpdGlvbmFsUHJvcGVydGllcyI6eyIkcmVmIjoiIy9jb21wb25lbnRzL3NjaGVtYXMvQXBpVmVyc2lvbiJ9LCJtaW5Qcm9wZXJ0aWVzIjoxfX0sImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjpmYWxzZX0sIkFwaVZlcnNpb24iOnsidHlwZSI6Im9iamVjdCIsInJlcXVpcmVkIjpbImFkZGVkIiwidXBkYXRlZCIsInN3YWdnZXJVcmwiLCJzd2FnZ2VyWWFtbFVybCIsImluZm8iLCJvcGVuYXBpVmVyIl0sInByb3BlcnRpZXMiOnsiYWRkZWQiOnsiZGVzY3JpcHRpb24iOiJUaW1lc3RhbXAgd2hlbiB0aGUgdmVyc2lvbiB3YXMgYWRkZWQiLCJ0eXBlIjoic3RyaW5nIiwiZm9ybWF0IjoiZGF0ZS10aW1lIn0sInVwZGF0ZWQiOnsiZGVzY3JpcHRpb24iOiJUaW1lc3RhbXAgd2hlbiB0aGUgdmVyc2lvbiB3YXMgdXBkYXRlZCIsInR5cGUiOiJzdHJpbmciLCJmb3JtYXQiOiJkYXRlLXRpbWUifSwic3dhZ2dlclVybCI6eyJkZXNjcmlwdGlvbiI6IlVSTCB0byBPcGVuQVBJIGRlZmluaXRpb24gaW4gSlNPTiBmb3JtYXQiLCJ0eXBlIjoic3RyaW5nIiwiZm9ybWF0IjoidXJsIn0sInN3YWdnZXJZYW1sVXJsIjp7ImRlc2NyaXB0aW9uIjoiVVJMIHRvIE9wZW5BUEkgZGVmaW5pdGlvbiBpbiBZQU1MIGZvcm1hdCIsInR5cGUiOiJzdHJpbmciLCJmb3JtYXQiOiJ1cmwifSwibGluayI6eyJkZXNjcmlwdGlvbiI6IkxpbmsgdG8gdGhlIGluZGl2aWR1YWwgQVBJIGVudHJ5IGZvciB0aGlzIEFQSSIsInR5cGUiOiJzdHJpbmciLCJmb3JtYXQiOiJ1cmwifSwiaW5mbyI6eyJkZXNjcmlwdGlvbiI6IkNvcHkgb2YgYGluZm9gIHNlY3Rpb24gZnJvbSBPcGVuQVBJIGRlZmluaXRpb24iLCJ0eXBlIjoib2JqZWN0IiwibWluUHJvcGVydGllcyI6MX0sImV4dGVybmFsRG9jcyI6eyJkZXNjcmlwdGlvbiI6IkNvcHkgb2YgYGV4dGVybmFsRG9jc2Agc2VjdGlvbiBmcm9tIE9wZW5BUEkgZGVmaW5pdGlvbiIsInR5cGUiOiJvYmplY3QiLCJtaW5Qcm9wZXJ0aWVzIjoxfSwib3BlbmFwaVZlciI6eyJkZXNjcmlwdGlvbiI6IlRoZSB2YWx1ZSBvZiB0aGUgYG9wZW5hcGlgIG9yIGBzd2FnZ2VyYCBwcm9wZXJ0eSBvZiB0aGUgc291cmNlIGRlZmluaXRpb24iLCJ0eXBlIjoic3RyaW5nIn19LCJhZGRpdGlvbmFsUHJvcGVydGllcyI6ZmFsc2V9LCJNZXRyaWNzIjp7ImRlc2NyaXB0aW9uIjoiTGlzdCBvZiBiYXNpYyBtZXRyaWNzIiwidHlwZSI6Im9iamVjdCIsInJlcXVpcmVkIjpbIm51bVNwZWNzIiwibnVtQVBJcyIsIm51bUVuZHBvaW50cyJdLCJwcm9wZXJ0aWVzIjp7Im51bVNwZWNzIjp7ImRlc2NyaXB0aW9uIjoiTnVtYmVyIG9mIEFQSSBkZWZpbml0aW9ucyBpbmNsdWRpbmcgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIEFQSSIsInR5cGUiOiJpbnRlZ2VyIiwibWluaW11bSI6MX0sIm51bUFQSXMiOnsiZGVzY3JpcHRpb24iOiJOdW1iZXIgb2YgdW5pcXVlIEFQSXMiLCJ0eXBlIjoiaW50ZWdlciIsIm1pbmltdW0iOjF9LCJudW1FbmRwb2ludHMiOnsiZGVzY3JpcHRpb24iOiJUb3RhbCBudW1iZXIgb2YgZW5kcG9pbnRzIGluc2lkZSBhbGwgZGVmaW5pdGlvbnMiLCJ0eXBlIjoiaW50ZWdlciIsIm1pbmltdW0iOjF9LCJ1bnJlYWNoYWJsZSI6eyJkZXNjcmlwdGlvbiI6Ik51bWJlciBvZiB1bnJlYWNoYWJsZSAoNFhYLDVYWCBzdGF0dXMpIEFQSXMiLCJ0eXBlIjoiaW50ZWdlciJ9LCJpbnZhbGlkIjp7ImRlc2NyaXB0aW9uIjoiTnVtYmVyIG9mIG5ld2x5IGludmFsaWQgQVBJcyIsInR5cGUiOiJpbnRlZ2VyIn0sInVub2ZmaWNpYWwiOnsiZGVzY3JpcHRpb24iOiJOdW1iZXIgb2YgdW5vZmZpY2lhbCBBUElzIiwidHlwZSI6ImludGVnZXIifSwiZml4ZXMiOnsiZGVzY3JpcHRpb24iOiJUb3RhbCBudW1iZXIgb2YgZml4ZXMgYXBwbGllZCBhY3Jvc3MgYWxsIEFQSXMiLCJ0eXBlIjoiaW50ZWdlciJ9LCJmaXhlZFBjdCI6eyJkZXNjcmlwdGlvbiI6IlBlcmNlbnRhZ2Ugb2YgYWxsIEFQSXMgd2hlcmUgYXV0byBmaXhlcyBoYXZlIGJlZW4gYXBwbGllZCIsInR5cGUiOiJpbnRlZ2VyIn0sImRhdGFzZXRzIjp7ImRlc2NyaXB0aW9uIjoiRGF0YSB1c2VkIGZvciBjaGFydGluZyBldGMiLCJ0eXBlIjoiYXJyYXkiLCJpdGVtcyI6e319LCJzdGFycyI6eyJkZXNjcmlwdGlvbiI6IkdpdEh1YiBzdGFycyBmb3Igb3VyIG1haW4gcmVwbyIsInR5cGUiOiJpbnRlZ2VyIn0sImlzc3VlcyI6eyJkZXNjcmlwdGlvbiI6Ik9wZW4gR2l0SHViIGlzc3VlcyBvbiBvdXIgbWFpbiByZXBvIiwidHlwZSI6ImludGVnZXIifSwidGhpc1dlZWsiOnsiZGVzY3JpcHRpb24iOiJTdW1tYXJ5IHRvdGFscyBmb3IgdGhlIGxhc3QgNyBkYXlzIiwidHlwZSI6Im9iamVjdCIsInByb3BlcnRpZXMiOnsiYWRkZWQiOnsiZGVzY3JpcHRpb24iOiJBUElzIGFkZGVkIGluIHRoZSBsYXN0IHdlZWsiLCJ0eXBlIjoiaW50ZWdlciJ9LCJ1cGRhdGVkIjp7ImRlc2NyaXB0aW9uIjoiQVBJcyB1cGRhdGVkIGluIHRoZSBsYXN0IHdlZWsiLCJ0eXBlIjoiaW50ZWdlciJ9fX0sIm51bURyaXZlcnMiOnsiZGVzY3JpcHRpb24iOiJOdW1iZXIgb2YgbWV0aG9kcyBvZiBBUEkgcmV0cmlldmFsIiwidHlwZSI6ImludGVnZXIifSwibnVtUHJvdmlkZXJzIjp7ImRlc2NyaXB0aW9uIjoiTnVtYmVyIG9mIEFQSSBwcm92aWRlcnMgaW4gZGlyZWN0b3J5IiwidHlwZSI6ImludGVnZXIifX0sImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjpmYWxzZSwiZXhhbXBsZSI6eyJudW1BUElzIjoyNTAxLCJudW1FbmRwb2ludHMiOjEwNjQ0OCwibnVtU3BlY3MiOjMzMjksInVucmVhY2hhYmxlIjoxMjMsImludmFsaWQiOjU5OCwidW5vZmZpY2lhbCI6MjUsImZpeGVzIjo4MTExOSwiZml4ZWRQY3QiOjIyLCJkYXRhc2V0cyI6W10sInN0YXJzIjoyNDI5LCJpc3N1ZXMiOjI4LCJ0aGlzV2VlayI6eyJhZGRlZCI6NDUsInVwZGF0ZWQiOjE3MX0sIm51bURyaXZlcnMiOjEwLCJudW1Qcm92aWRlcnMiOjY1OX19fSwicGFyYW1ldGVycyI6eyJwcm92aWRlciI6eyJuYW1lIjoicHJvdmlkZXIiLCJpbiI6InBhdGgiLCJyZXF1aXJlZCI6dHJ1ZSwic2NoZW1hIjp7InR5cGUiOiJzdHJpbmciLCJtaW5MZW5ndGgiOjEsIm1heExlbmd0aCI6MjU1LCJleGFtcGxlIjoiYXBpcy5ndXJ1In19LCJhcGkiOnsibmFtZSI6ImFwaSIsImluIjoicGF0aCIsInJlcXVpcmVkIjp0cnVlLCJzY2hlbWEiOnsidHlwZSI6InN0cmluZyIsIm1pbkxlbmd0aCI6MSwibWF4TGVuZ3RoIjoyNTUsImV4YW1wbGUiOiIyLjEuMCJ9fX19fQo=\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://api.apis.guru/v2/\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/apiguru-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"apigw_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/metrics.json\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"apigw_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"API Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config" + ] } - } + }, + "response": [] }, - "url": { - "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config/{{configUid}}", - "protocol": "http", - "host": [ - "{{ncg_host}}" + { + "name": "APIGuru API Gateway RateLimit + JWT AuthN/AuthZ + redocly + moesif", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var respData = JSON.parse(responseBody);", + "", + "tests[\"configUid is: \" +respData.configUid] = respData.configUid;", + "", + "pm.collectionVariables.set('configUid',respData.configUid);" + ], + "type": "text/javascript", + "packages": {}, + "requests": {} + } + } ], - "port": "{{ncg_port}}", - "path": [ - "{{ngc_api_version}}", - "config", - "{{configUid}}" - ] - } - }, - "response": [] - }, - { - "name": "6. Test application - echo test", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "http://echo.vm-blank.ie.ff.lan", - "protocol": "http", - "host": [ - "echo", - "vm-blank", - "ie", - "ff", - "lan" - ] + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"APIGuru\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/apiguru\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://intranet.ie.ff.lan/apiguru.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://api.apis.guru/v2/\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/apiguru-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/providers.json\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"apigw_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/metrics.json\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"apigw_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"API Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/config", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "config" + ] + } + }, + "response": [] } - }, - "response": [] + ] }, - { - "name": "7. Test application - random joke", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "http://randomjoke.vm-blank.ie.ff.lan/random_joke", - "protocol": "http", - "host": [ - "randomjoke", - "vm-blank", - "ie", - "ff", - "lan" - ], - "path": [ - "random_joke" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "API Gateway", - "item": [ { "name": "Petstore API", "item": [ @@ -9120,7 +9752,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -9129,7 +9762,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -9165,7 +9798,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -9174,7 +9808,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"syslog:server=192.168.2.13:514\"\n },\n \"error\": {\n \"destination\": \"syslog:server=192.168.2.13:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"syslog:server=192.168.2.13:514\"\n },\n \"error\": {\n \"destination\": \"syslog:server=192.168.2.13:514\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -9210,7 +9844,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -9219,7 +9854,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_app_protect_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ],\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked-bot-allowed.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": \"/var/log/nginx/apigw.nginx.lab-access_log\",\n \"error\": \"/var/log/nginx/apigw.nginx.lab-error_log\"\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": \"/var/log/nginx/petstore-access_log\",\n \"error\": \"/var/log/nginx/petstore-error_log\"\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\"\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_app_protect_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": \"/var/log/nginx/apigw.nginx.lab-access_log\",\n \"error\": \"/var/log/nginx/apigw.nginx.lab-error_log\"\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": \"/var/log/nginx/petstore-access_log\",\n \"error\": \"/var/log/nginx/petstore-error_log\"\n },\n \"app_protect\": {\n \"enabled\": true,\n \"policy\": \"production-policy\"\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"policies\": [\n {\n \"type\": \"app_protect\",\n \"name\": \"production-policy\",\n \"active_tag\": \"xss-blocked\",\n \"versions\": [\n {\n \"tag\": \"xss-blocked\",\n \"displayName\": \"Production Policy - XSS blocked\",\n \"description\": \"This is a production-ready policy - XSS blocked\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-blocked-bot-allowed.json\"\n }\n },\n {\n \"tag\": \"xss-allowed\",\n \"displayName\": \"Production Policy - XSS allowed\",\n \"description\": \"This is a production-ready policy - XSS allowed\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/nap-policy-xss-allowed.json\"\n }\n }\n ]\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -9255,7 +9890,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -9264,7 +9900,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": []\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -9300,7 +9936,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -9309,7 +9946,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": true,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -9345,7 +9982,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -9354,7 +9992,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"cache\": {\n \"profile\": \"10m cache\",\n \"key\": \"$uri\",\n \"validity\": [\n {\n \"code\": \"200\",\n \"ttl\": \"5s\"\n }\n ]\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"cache\": [\n {\n \"profile\": \"10m cache\",\n \"key\": \"$http_method$uri\",\n \"validity\": [\n {\n \"code\": \"any\",\n \"ttl\": \"30s\"\n },\n {\n \"code\": \"302\",\n \"ttl\": \"5m\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/store/inventory\"\n ]\n }\n ]\n },\n \"cache\": {\n \"profile\": \"10m cache\",\n \"key\": \"$http_method$uri\",\n \"validity\": [\n {\n \"code\": \"any\",\n \"ttl\": \"30s\"\n },\n {\n \"code\": \"302\",\n \"ttl\": \"5m\"\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"cache\": [\n {\n \"name\": \"10m cache\",\n \"basepath\": \"/tmp\",\n \"size\": \"10m\",\n \"ttl\": \"10m\"\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nms\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ndk_http_module\",\n \"ngx_http_lua_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Petstore API\",\n \"names\": [\n \"apigw.nginx.lab\"\n ],\n \"resolver\": \"Google\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"cache\": {\n \"profile\": \"10m cache\",\n \"key\": \"$uri\",\n \"validity\": [\n {\n \"code\": \"200\",\n \"ttl\": \"5s\"\n }\n ]\n },\n \"locations\": [\n {\n \"uri\": \"/petstore\",\n \"urimatch\": \"prefix\",\n \"apigateway\": {\n \"openapi_schema\": {\n \"content\": \"https://petstore3.swagger.io/api/v3/openapi.json\"\n },\n \"api_gateway\": {\n \"enabled\": true,\n \"strip_uri\": true,\n \"server_url\": \"https://petstore3.swagger.io\"\n },\n \"developer_portal\": {\n \"enabled\": false,\n \"type\": \"redocly\",\n \"redocly\": {\n \"uri\": \"/petstore-devportal.html\"\n }\n },\n \"visibility\": [\n {\n \"enabled\": true,\n \"type\": \"moesif\",\n \"moesif\": {\n \"application_id\": \"{{moesif_application_id}}\"\n }\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"Petstore JWT Authentication\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n },\n \"authorization\": [\n {\n \"profile\": \"JWT role based authorization\",\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"profile\": \"petstore_ratelimit\",\n \"httpcode\": 429,\n \"burst\": 0,\n \"delay\": 0,\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/user/login\",\n \"/user/logout\",\n \"/pet/{petId}/uploadImage\"\n ]\n }\n ],\n \"cache\": [\n {\n \"profile\": \"10m cache\",\n \"key\": \"$http_method$uri\",\n \"validity\": [\n {\n \"code\": \"any\",\n \"ttl\": \"30s\"\n },\n {\n \"code\": \"302\",\n \"ttl\": \"5m\"\n }\n ],\n \"enforceOnPaths\": true,\n \"paths\": [\n \"/store/inventory\"\n ]\n }\n ]\n },\n \"cache\": {\n \"profile\": \"10m cache\",\n \"key\": \"$http_method$uri\",\n \"validity\": [\n {\n \"code\": \"any\",\n \"ttl\": \"30s\"\n },\n {\n \"code\": \"302\",\n \"ttl\": \"5m\"\n }\n ]\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/apigw-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/apigw-error.log\"\n }\n }\n }\n ]\n }\n ],\n \"rate_limit\": [\n {\n \"name\": \"petstore_ratelimit\",\n \"key\": \"$binary_remote_addr\",\n \"size\": \"10m\",\n \"rate\": \"2r/s\"\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"Petstore JWT Authentication\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"realm\": \"Petstore Authentication\",\n \"key\": \"{\\\"keys\\\": [{\\\"k\\\":\\\"ZmFudGFzdGljand0\\\",\\\"kty\\\":\\\"oct\\\",\\\"kid\\\":\\\"0001\\\"}]}\",\n \"cachetime\": 5\n }\n }\n ]\n },\n \"authorization\": [\n {\n \"name\": \"JWT role based authorization\",\n \"type\": \"jwt\",\n \"jwt\": {\n \"claims\": [\n {\n \"name\": \"roles\",\n \"value\": [\n \"~(devops)\"\n ],\n \"errorcode\": 403\n }\n ]\n }\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n },\n \"cache\": [\n {\n \"name\": \"10m cache\",\n \"basepath\": \"/tmp\",\n \"size\": \"10m\",\n \"ttl\": \"10m\"\n }\n ]\n },\n \"resolvers\": [\n {\n \"name\": \"Google\",\n \"address\": \"8.8.8.8\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -9769,7 +10407,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -9778,7 +10417,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"nginx_plus_api\": {\n \"write\": false,\n \"listen\": \"127.0.0.1:8080\",\n \"allow_acl\": \"0.0.0.0/0\"\n }\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -10272,7 +10911,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -10281,7 +10921,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ]\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ]\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -10560,7 +11200,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -10569,7 +11210,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"server_cert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdSRENDQkN5Z0F3SUJBZ0lVTTNJQVZIRmxhSTVsY1d0TjZxOUVhcnlka0w4d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TVRBd01qTTVXaGNOCk1qUXdOakEzTVRBd01qTTVXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMRFQ2bnZleVZlNi9VZlk2aUtHVC9oV1A0cktDSGR0ClloZWU3RGVZR29QWGhGVjB6a3grVWExanBEZ21WUE1kVEJBdnoxODg5NzlEcHBqdmNYeFhsRmpnaUhjWDhpWVgKSXovSUVMc3dKRUNITWNsNkxmelA5eDVUY1gxTEdFblFOTWhHRzA2MjlxU2NCQmQyUUNiWlY0UWE1TkxlQnQ4cQpHQ2lXY3JiQnR3YlpiSGo1dk9aenJrdHBtRFBGS1V4bXR5b2dBQnNaTllnL0F3Y1l2RXdBOEQ0QTN0VEgxcGhvCkdYY3ZvZWpJelhRMUdmYys5azR3OFhHYWFQOGd2bTdOMXN2MnU2Yld4SHRGZHpWQk9udzJyaHUvWGYyY0N0dW4KUnIxSENKQXRRSDlkbDhzZks1czBSRlVuTlVYbFBiNTFBTjBjVFVGbEYrZlVUVmVON3dNMTdmeVZVY3IydTltSwo0UGdoWjkvMml0ZUpZV3hjK3k4V2NEQzBUV3hwZ2paVEw5Tk1GK2t6SXV2TjJOWFFybjcvSU5UQTMvNFlmWGRPCloxelpTdTlkclRMcG5DZHRpOWxuRHBKODd3bW41cVZSTlZiTlZRbldEeW5yZnoyTU1DY21jLzcvdkJFN2dDemQKNFJLWHJLdHloenlQSitycmh3NmpxYVA4QytaZGRvKzkvak9QVDFTSnUxZ21VbzFuZ2hBMWh2N0M5RUYrM2xQVApYSk5WV3dtYkdWK0p4cUdKSjJSa2toMlIrZTVIREdRY2hGWjJIcXBGTGVQN0trTHJBR2RkZFZQWEZhQ0RiU0R6ClJQd0I5WFlhakg5Zm5QWEtFT3ZpVEJhQVNjWUZwTXB5cm02UkxHUGRSVnE2RUNYVlB4MDdHdGFCaEVvVWIwK2YKVkZnNExtQkx4MldQQWdNQkFBR2pnZ0VpTUlJQkhqQUpCZ05WSFJNRUFqQUFNQkVHQ1dDR1NBR0crRUlCQVFRRQpBd0lHUURBekJnbGdoa2dCaHZoQ0FRMEVKaFlrVDNCbGJsTlRUQ0JIWlc1bGNtRjBaV1FnVTJWeWRtVnlJRU5sCmNuUnBabWxqWVhSbE1CMEdBMVVkRGdRV0JCVHZFZWJGK1JDV0JhcGVPWUdpQ0YyVHZxbExYekNCaEFZRFZSMGoKQkgwd2U0QVVFdW9Db3kvcmhMQmxzcm5KdXE2QzFJczQxbFNoVGFSTE1Fa3hDekFKQmdOVkJBWVRBa2xVTVEwdwpDd1lEVlFRSURBUkJjM1JwTVJFd0R3WURWUVFLREFoVVpYTjBJRXhoWWpFWU1CWUdBMVVFQXd3UGRtMHRZbXhoCmJtc3VabVl1YkdGdWdoUld4QjhCa3lmK1RkQXc2Q3dPZE1aT0k0NlZ2REFPQmdOVkhROEJBZjhFQkFNQ0JhQXcKRXdZRFZSMGxCQXd3Q2dZSUt3WUJCUVVIQXdFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFHUDR6ZkdseTI1RwpneTBSeC9SSTNpNzJDVlIrSXY3SW5WTUVGWDZqRHRNV3hSblFtRGZsMWtTOVF1Y3hNb0tnOE9URStMcnlzdGJsClF4WGZiakZQekNoNHB1UGtGTmNBeG1mVmR4b20xR1lodWpoYTBQOUswUURZSDZycGlUaFdSQ2greUovQm1qZ2wKTlJabks4WGRqME85Ui9XKzJrTFRac2VFbS9hZHFVQ3dkYzNBWWlNWGh4QXkvQlh3bFRQeDMyMHZCcXYxZGFyVgp5ZlVoRlM1Rkg3enV2bGtGQ1p6M3lpOGYvYXMwbkRTUkFrY3dPRFQvN1diQlN4QTk3ZzJmRk1EMEI3WlUvbndGCmU4VnRzNDl3YmZ6QWJRMk40RUc2OEVhODE1VlFRM2N6YWthdjBCdkxHL2UwT0habGxYcUVhV1ZlWFJtSWFFOHcKWko5OEhUaDJMbUlFV2Jpdm94Kyt2UXd3bVhKTm1DRFVXNnVmcHdBOVdKQ0VhYmhxeXdGVzh1dFVENzRTVXE3SApEUDhNamtJZ0o3ekl2Tkd1RkFsSzd6c2xpV2pzeUN1OGVNamhvN2pVRFhGR1R0R0ZMUGtVa08vSysrSGVVRFg0Cm1OWDJ2aHI3NGRqRkNBTTEvOTYxWnB5NUFYUzZkd2g3MFlJL2dMdldSL0J1ejBnNEp6YUI2UFo4M1ErYm9QVHYKM1ZIS2xOWjlKQlhRTmtSc3N6U0dYWG5MYmtOTmNwVFg2cnAyZ1pUSS9NNDhGTnBxanAxOXRpQVg3bWN0cTl2SgpNejhvemhEcHZmSTlnMjFsNFZlRGdpbWEwTDVBc1pQbFdIQlZjcy9yL3dMU2YzWFVYZEs0UHpCQUdIRFBidXYrCnpKOVNqS0NFVll2bHRhMHlUUVBCSFJPa2Y2MG1sVmh6Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"server_key\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBc05QcWU5N0pWN3I5UjlqcUlvWlArRlkvaXNvSWQyMWlGNTdzTjVnYWc5ZUVWWFRPClRINVJyV09rT0NaVTh4MU1FQy9QWHp6M3YwT21tTzl4ZkZlVVdPQ0lkeGZ5SmhjalA4Z1F1ekFrUUljeHlYb3QKL00vM0hsTnhmVXNZU2RBMHlFWWJUcmIycEp3RUYzWkFKdGxYaEJyazB0NEczeW9ZS0paeXRzRzNCdGxzZVBtOAo1bk91UzJtWU04VXBUR2EzS2lBQUd4azFpRDhEQnhpOFRBRHdQZ0RlMU1mV21HZ1pkeStoNk1qTmREVVo5ejcyClRqRHhjWnBvL3lDK2JzM1d5L2E3cHRiRWUwVjNOVUU2ZkRhdUc3OWQvWndLMjZkR3ZVY0lrQzFBZjEyWHl4OHIKbXpSRVZTYzFSZVU5dm5VQTNSeE5RV1VYNTlSTlY0M3ZBelh0L0pWUnl2YTcyWXJnK0NGbjMvYUsxNGxoYkZ6NwpMeFp3TUxSTmJHbUNObE12MDB3WDZUTWk2ODNZMWRDdWZ2OGcxTURmL2hoOWQwNW5YTmxLNzEydE11bWNKMjJMCjJXY09rbnp2Q2FmbXBWRTFWczFWQ2RZUEtldC9QWXd3Snlaei92KzhFVHVBTE4zaEVwZXNxM0tIUEk4bjZ1dUgKRHFPcG8vd0w1bDEyajczK000OVBWSW03V0NaU2pXZUNFRFdHL3NMMFFYN2VVOU5jazFWYkNac1pYNG5Hb1lrbgpaR1NTSFpINTdrY01aQnlFVm5ZZXFrVXQ0L3NxUXVzQVoxMTFVOWNWb0lOdElQTkUvQUgxZGhxTWYxK2M5Y29RCjYrSk1Gb0JKeGdXa3luS3VicEVzWTkxRldyb1FKZFUvSFRzYTFvR0VTaFJ2VDU5VVdEZ3VZRXZIWlk4Q0F3RUEKQVFLQ0FnQVBUR1pQRFRsU004VlIvL3hSdkZrUzNUTm1LSkNPOUpHMkJYUGVZM1IzejUrTlhTdTBCb0craEk1aQpwVDVZUWtLZ2ErSi9GT0ZDVlBJRzdVQmVSNTE0Q3dVRGVMamtmci8zOXJFcjRNQmlMTkFyNUR3eVVUUEtGZUlOCnV2K0E4MWg5czBNTmpsck1ad3NibElsOFV2VjFZblpGb0J2c0Z0SThRTGZ3QTlaMzZ6dXRRNzRLR2h3TVBqaUMKMGgzK2xDeG9vcGdmd0JDWGx3d0dBeWZYVTRWMWQ5SFBpdktRQVFHakJDWDM0OWVTcEQxNDNLT21wQ2xmY01LQQp3QzU1bTZsbndCTUFIamlsaVo4RXBuNE8zUlEzSmxsVlpiaXl4RWdrZkE3TG1uNm9Ca3Jwc2VxdDVObThuRVhKCnBFbXhQcUl5Znc1WUNBMEhhNkM5WUhRN1RPRW9BbHBmWld4azAxSnpoVi9aK3FmVHM1YlMwQWNaTzFOVDRaeDgKWlF2eHQ0TDJINVcrK2R6RjhReTlidzQ2M3lKb1dydWxtNy9uQ3YvL1FpNGl0eHRnYyt0N2lwVXZzaUdTVktVWQpPelhCSXNWTUlnd0F6eUtTSEhPL21rMkEwVkgxaHB3emY2L0RzR2wxSjM4TU9pVGo4dEx1RWt3cFY4WGh5MnZwCkd0cXpsT21DS1hodlVDam9iZWlYSWJwSlIzeEM1NmliRjVadk0vQUdONzI5K0xKRFNwbHJtWVJRVHh1UTJWSE8KQWFXQ01SQWFBdUtCVnBxYTRjd25WRy9POEpkN2ZPSi9tMFlIN3FpRlJHREdvdVNOdHZJUUVtaXVkK3dRWjJ6dwpUcmFNVWk0SENtNEFPa0ZNVXBsRmt1ajA2ZHRqM2RIWUtPQkdMK25vaUp4WmJxb3kwUUtDQVFFQTFiZUl6WHh6CnRFRlp2OGRlOXljOWdCUUtNNUNIbHp6NUNMZXVkTitvemxxeDNCMW1PRStxbFkyaEd3RklIWVBJajFLYS83RlkKbExmNFpiUEJRMFhiNUo5VzQzSGIyTnEydXdRQ3ZiSXhVMW9zaGJVWlhZc2FUaE15azc2VzQ5YjU3UC9HdFE3NwpTbkVZTXNrTzRUQndyS3lBdVhDVHRtTk1Qa2J1NFBxT05PeVFQY3o3Yi92VEU1eERjMENMVS9oUXM3NWFHeCs1Citld2VjeEZNa0JKTVo2c2N5TzcySEdSNHZwTHduRXUvcU5uN2JmUElSaUx1T3BwTTdHNlUwQlBPL2todHJ5ZmQKV3U3MHJYZGJSdGRJUHlsQWxSOG9zczJqWWsrRHNPUnNESm9pbkk5WU1Va3dmdHdCNTRQbytGRGtGOHBzV202RQpSaklpenFBK0piWDlTd0tDQVFFQTA4Ly9oM0NabDg2M2xUZHNrU1JKRUZKc0RtdkZkUStzMWtlNUFwMjdnWTBXCmZJbEFGZFlRR3RORUVlTk9xS3EwdTFtS0lqWHFacWNTdU9DNzZIYTE5Tk9waHVoK1dwV0t2Ni9BTWtQSjE5SUIKQ3RqS0lkc2s0U2M3WG02MnNOV1pnQm5XT1Z3QVdzU0VzTHRac1NvWUJUVTJJS1pBOVJOWHhkSEQreGZ2SWJkNApZYngzTzk4WklNQzNlVFFiOW9jVHZab0RNWGdLaHRtTy9iMnlSeEVDSGpGRmxzYlhhc1RPeG5XOWZSVXJtdGVqCk9pdVlXaEZOM2R6dmpuVEdLY0xieWY0MWpHaUVUeFViUHVpei9ZMmk5NldCNVN6MW9zaGorRU1OaFhtRzZSYXUKQUIvelhwNldtSUJ2bDNpU0lzOGJRNkh3Qm1DTjc1R2VVVG1GUUlyaVRRS0NBUUVBbTkzWVN5MXA0VndNRGI5bApObElMRzM4Q0ZhdGlDRjR5cmpYd2FWSzVkWTVWeTFneHRmMzhSa2hkNkNrZUpGQjVsSFhGajVnVEo1dW84TnVSCnB2T3JOT2swNEhxb3dWWjZFSmtUT3JCY0l4TlFCMUFXS05BTHBrZUFDcHJreDFTQlFHVW0wZVFVUjYyRjNYd2YKZXdMdUdqRlJURzJiZlZpY1FZdFFLd3J4YmczZUFRU2ZtSU9MNVBDQmpPdlU4YS9YZzgvZlBZcjlBeFkrK3VMeAorTjB2bGlnSXZVN3lkYkNkRXpodGZVQU5qeU16cVhRemExdU1iWGNkaFEzOVFHaEIvZGhyRG1TL250Tko1YjEzCjk0bUpLbTkycDR0ckRrVEYxU3h5dWk5TjBqOFQ0U1QyU0RPOXg3ZkROOHRQdk5LYUYvUE01SU5YdXk1VGptajIKQ21EWlV3S0NBUUFOUVJYSFh1ZHRsWFR0ZEhOcHZiQ0l3ZStiRTJsZXd1VlkzMUlYZE5GWDhRRTROOHAzMDFaYwpwMTI2Rk5SR1A3QmhqTi9VOWpTOXliU2xOd0xyTUFxQTBJSHFQRUF6NE9tMnh3T3E0WTBPNFVoSmFubHpsdWYrCjR0cVhOU3hmY201UmtzeFIrSXpaSVRVQWJpalZxa0dvaWNUaVZDVDZjUVJzRDQxSStCMXhxYTV4eHo1YTA4SVoKeDVWemt5d3d5QkVYS3owSjZtNFdOQ1Q3Z2RSWEdCeGUwVXgrZStEZEFJWEQ2M2c1RElzVy9HbHRhVzcySytFSQpnaHZIZVUweExjMWRIWGd5V2hQMWN1ZXFqeHM4UVpHeUYzeENZQWJhOGRrM250S0l5S3NGaVBMSWRUZGdjMklQCkZ2SmtzeG5KN2RYUjdKODlkdXRLMDN6cHJrVEZYaXQ5QW9JQkFDcjhkb2ZCcFlFL1JuTlFwbVNET29DRm1sdTkKQlozN3h5K0puZ2FrQ2RSdHFyR1lDdkZMSnI2QnpGdXE0SHpsM0piTkRCM1BkYSs4Z2VNd2cxU1htTEhrRVFrTQpXV2ptNHpmU3hiTUtKamx3REdoeUlwSU9nQ2FQL1hyT2hxTGl4bnJ6UHFHZmM4R0FZTDE2Rm1PeGVqbVk5aERtCmNibkFqZlNwUjF1WEt2S2d6d1NLQ0VWdzc0VjJSRmRqQXBLVDl3bkpOQTZiWHQ5SXFkaS96d3BYbDQ0OVczdVMKNjRjVVpaK3luYnQ5QUlxbFNjMDdNRHl1TUtueExMbDFLeEJYenNxZlVsYWtlRGVoVmdGS05OOTNXQWJJc09ieAp1d1hTd0hXa1B6RGFHeE9wdzlSMHo2S2t2N25YZnBIYW1RWENBZEdsRjkyc1QwYW80Y3FuejFJSmJ2bz0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K\"\n }\n },\n {\n \"type\": \"certificate\",\n \"name\": \"cacert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjekNDQTF1Z0F3SUJBZ0lVVnNRZkFaTW4vazNRTU9nc0RuVEdUaU9PbGJ3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TURrMU5EQTRXaGNOCk1qUXdOakEzTURrMU5EQTRXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMlQwWXpkcjB0dWQzaVJRNGNzaGNhRVJTRzVjTDE2CkhRblhoYWw4emlUL1VRQUNIUGdzZDYwcWlEaldvQTJXb0lGWFFpUHkzOG1vZGtWRlR4Qmt5U2VldndOOFJiLzEKOFhaMS8yS1RnVmRDcHkvNm11WE15bXZYODJad05CVkV3QnoxUk5kbklUSk44cVh3a0d4bHozbDBib1loRkFyUQpNdmkxcW1RaHpDa2Zpb041MVkrYlBXOXpTQlFQdXNrcXJYYzRqTTJ0VENNQ2pTcFlvd1hXM1ppRmc5WEJ1Z09aCjFmdWd1Zmw4K1FJYzNZSEFoL1Z1NloraXFEOGxQeGRKODlBeDZaazVtOGdkVG9JdUhBbUNWaHFpUXBGRjkzSTgKbkYrSnRuYnBaNTRJUTZBbWYrYiswakMxdmY4Kzg0WUppaEVzWExyaGMxZTRTZ2dwdzEvcWpDb21QblhGVjEzUwpsUG5kVlhVR0taa1ZKdXdZTjJyZElmd3YrdCs5MGhwUVBmNmFBTjRCamRxOXdkdkQzSXVnS2JYZG5CQ0FUTEY4ClYyRTFTSE9VZGdRY3duK1d1WDVVOGdPa3B2b2VFN0g1REJ6Rks1WTZ2SHZlaTRlNkp3RTRDK3FJL1BmbTgreTEKNEpsOFBSOW5JQmdGQ3hrZWpwa2tRQ0I5U0dvMVZidzZhWmdZd0VQNHh6YXFYYXV3L3F4c0oxNUkrRTBndEs1OApuWUtkM0hqelk5Slh6V0NVNTdXbmc2SzNvTTIzNXpyRzJnNm1FaHQ4SStDckVMUFNuZURjZU8zVlJkc2dlblBCCis4U1JxVU8vWG9LWHNEU3I5amoxdWluVzYwTG5MZ0Zmc3JQeGlQVlZlMFh1TFZESlhCSlNoRDZDeGRyMnBSOGQKS25SRDZrTFpZZEtMQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqVwpWREFmQmdOVkhTTUVHREFXZ0JRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqV1ZEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJad3B4Z2Z4N2thZFhvRHNyT1hUVXJ6dEFPMkFQRVJNaTAKaTkyNk9DTGFPbVVYZW1uKytXSUU1K2tUSE0wcS8vbUZCTURzSmdZSFVLUlNvRGNsNmh4TnVFNUNzS2trRVFTSgpMTHZrWlB0S2J5NGlxMitLZ1JtdVZxbXJNVTBYQzZMZDl3WmttL2huUjNtT3V6bko4MGZmV1JDQ0xGWDEwY2EzCnc5TGM1d1JLTFBZZXQvcEs5SitOYWN3TFJRYTczVFovMUpQNW9BU3czVjNoYkxlLy9UeWpnOURqUlZGY3FYWnEKWWs2Mm5qSkhZVzh3WmlhZzc0QXU4dHE5OG5KandBV1ROMFV5L2w1Q2VpWnV5bzZlU0RHVDNJNm1BdGU1VXBvWAppNXBkYlZ6VDdOZC9IOEwwZHZNdVZ2N0FmakZlcU91cUZNNkkzTnlvbStLWENxNmJQdGxBWEkzeVFZc0t4ZlRkCkw3SnRaTmx6MGJ6eHJhcHI4RmpYcjhML1ZkeHQza00xMnJwb2kzL3hsckR6Q2Q2b2YrQ1MxelBocUdpOUhvcUoKZEU5VGhYMklTdkd2akVSYzVVNFRsNjJBNHNyeGJQbUt0eWx3dGNGVEJacUJiRGY3ZjBBc2cveWhndXdTcktsQQpBNkRWVXVCRFErdGpwZ0N0b0ZlOEhLVDJ6UFVlaEQ2ZjVNQkhmU2ZUZ1crTlhFSXNvVDNsampjY1hsYXhPcFJWCkNQNWxCczNmekxyYnBxbUlLaWZhdWlTNWM4TzlSUjhjQTVzeWlBOTBmbmJIdDlmdGxpRG9jcFRzNUtrbjk2NkIKZUxMM1dXVldCYUtvanJzY1RkVXJoalNnVVBmam5FTXpnVzR2eEc3d3BVNHR2ME4yaEtHUWc0bVhhcDV0SU5Pcwp4WktnZXRHUldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"vm-blank.ff.lan\"\n ],\n \"resolver\": \"private DNS\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"server_cert\",\n \"key\": \"server_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"mTLS-client-profile\"\n }\n ]\n }\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://origin_server\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"origin_server\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"mTLS-client-profile\",\n \"type\": \"mtls\",\n \"mtls\": {\n \"enabled\": \"on\",\n \"client_certificates\": \"cacert\",\n \"trusted_ca_certificates\": \"cacert\",\n \"ocsp\": {\n \"enabled\": \"on\",\n \"responder\": \"http://ocsp.k8s.ie.ff.lan\"\n },\n \"stapling\": {\n \"enabled\": true,\n \"verify\": true,\n \"responder\": \"http://ocsp.k8s.ie.ff.lan\"\n }\n }\n }\n ]\n }\n },\n \"resolvers\": [\n {\n \"name\": \"private DNS\",\n \"address\": \"192.168.2.13\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ]\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"vm-blank.ff.lan\"\n ],\n \"resolver\": \"private DNS\",\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"server_cert\",\n \"key\": \"server_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ],\n \"authentication\": {\n \"client\": [\n {\n \"profile\": \"mTLS-client-profile\"\n }\n ]\n }\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://origin_server\"\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"origin_server\",\n \"origin\": [\n {\n \"server\": \"192.168.1.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"client\": [\n {\n \"name\": \"mTLS-client-profile\",\n \"type\": \"mtls\",\n \"mtls\": {\n \"enabled\": \"on\",\n \"client_certificates\": \"cacert\",\n \"trusted_ca_certificates\": \"cacert\",\n \"ocsp\": {\n \"enabled\": \"on\",\n \"responder\": \"http://ocsp.k8s.ie.ff.lan\"\n },\n \"stapling\": {\n \"enabled\": true,\n \"verify\": true,\n \"responder\": \"http://ocsp.k8s.ie.ff.lan\"\n }\n }\n }\n ]\n }\n },\n \"resolvers\": [\n {\n \"name\": \"private DNS\",\n \"address\": \"192.168.2.13\",\n \"ipv4\": true,\n \"ipv6\": false,\n \"timeout\": \"30s\"\n }\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"server_cert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdSRENDQkN5Z0F3SUJBZ0lVTTNJQVZIRmxhSTVsY1d0TjZxOUVhcnlka0w4d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TVRBd01qTTVXaGNOCk1qUXdOakEzTVRBd01qTTVXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMRFQ2bnZleVZlNi9VZlk2aUtHVC9oV1A0cktDSGR0ClloZWU3RGVZR29QWGhGVjB6a3grVWExanBEZ21WUE1kVEJBdnoxODg5NzlEcHBqdmNYeFhsRmpnaUhjWDhpWVgKSXovSUVMc3dKRUNITWNsNkxmelA5eDVUY1gxTEdFblFOTWhHRzA2MjlxU2NCQmQyUUNiWlY0UWE1TkxlQnQ4cQpHQ2lXY3JiQnR3YlpiSGo1dk9aenJrdHBtRFBGS1V4bXR5b2dBQnNaTllnL0F3Y1l2RXdBOEQ0QTN0VEgxcGhvCkdYY3ZvZWpJelhRMUdmYys5azR3OFhHYWFQOGd2bTdOMXN2MnU2Yld4SHRGZHpWQk9udzJyaHUvWGYyY0N0dW4KUnIxSENKQXRRSDlkbDhzZks1czBSRlVuTlVYbFBiNTFBTjBjVFVGbEYrZlVUVmVON3dNMTdmeVZVY3IydTltSwo0UGdoWjkvMml0ZUpZV3hjK3k4V2NEQzBUV3hwZ2paVEw5Tk1GK2t6SXV2TjJOWFFybjcvSU5UQTMvNFlmWGRPCloxelpTdTlkclRMcG5DZHRpOWxuRHBKODd3bW41cVZSTlZiTlZRbldEeW5yZnoyTU1DY21jLzcvdkJFN2dDemQKNFJLWHJLdHloenlQSitycmh3NmpxYVA4QytaZGRvKzkvak9QVDFTSnUxZ21VbzFuZ2hBMWh2N0M5RUYrM2xQVApYSk5WV3dtYkdWK0p4cUdKSjJSa2toMlIrZTVIREdRY2hGWjJIcXBGTGVQN0trTHJBR2RkZFZQWEZhQ0RiU0R6ClJQd0I5WFlhakg5Zm5QWEtFT3ZpVEJhQVNjWUZwTXB5cm02UkxHUGRSVnE2RUNYVlB4MDdHdGFCaEVvVWIwK2YKVkZnNExtQkx4MldQQWdNQkFBR2pnZ0VpTUlJQkhqQUpCZ05WSFJNRUFqQUFNQkVHQ1dDR1NBR0crRUlCQVFRRQpBd0lHUURBekJnbGdoa2dCaHZoQ0FRMEVKaFlrVDNCbGJsTlRUQ0JIWlc1bGNtRjBaV1FnVTJWeWRtVnlJRU5sCmNuUnBabWxqWVhSbE1CMEdBMVVkRGdRV0JCVHZFZWJGK1JDV0JhcGVPWUdpQ0YyVHZxbExYekNCaEFZRFZSMGoKQkgwd2U0QVVFdW9Db3kvcmhMQmxzcm5KdXE2QzFJczQxbFNoVGFSTE1Fa3hDekFKQmdOVkJBWVRBa2xVTVEwdwpDd1lEVlFRSURBUkJjM1JwTVJFd0R3WURWUVFLREFoVVpYTjBJRXhoWWpFWU1CWUdBMVVFQXd3UGRtMHRZbXhoCmJtc3VabVl1YkdGdWdoUld4QjhCa3lmK1RkQXc2Q3dPZE1aT0k0NlZ2REFPQmdOVkhROEJBZjhFQkFNQ0JhQXcKRXdZRFZSMGxCQXd3Q2dZSUt3WUJCUVVIQXdFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFHUDR6ZkdseTI1RwpneTBSeC9SSTNpNzJDVlIrSXY3SW5WTUVGWDZqRHRNV3hSblFtRGZsMWtTOVF1Y3hNb0tnOE9URStMcnlzdGJsClF4WGZiakZQekNoNHB1UGtGTmNBeG1mVmR4b20xR1lodWpoYTBQOUswUURZSDZycGlUaFdSQ2greUovQm1qZ2wKTlJabks4WGRqME85Ui9XKzJrTFRac2VFbS9hZHFVQ3dkYzNBWWlNWGh4QXkvQlh3bFRQeDMyMHZCcXYxZGFyVgp5ZlVoRlM1Rkg3enV2bGtGQ1p6M3lpOGYvYXMwbkRTUkFrY3dPRFQvN1diQlN4QTk3ZzJmRk1EMEI3WlUvbndGCmU4VnRzNDl3YmZ6QWJRMk40RUc2OEVhODE1VlFRM2N6YWthdjBCdkxHL2UwT0habGxYcUVhV1ZlWFJtSWFFOHcKWko5OEhUaDJMbUlFV2Jpdm94Kyt2UXd3bVhKTm1DRFVXNnVmcHdBOVdKQ0VhYmhxeXdGVzh1dFVENzRTVXE3SApEUDhNamtJZ0o3ekl2Tkd1RkFsSzd6c2xpV2pzeUN1OGVNamhvN2pVRFhGR1R0R0ZMUGtVa08vSysrSGVVRFg0Cm1OWDJ2aHI3NGRqRkNBTTEvOTYxWnB5NUFYUzZkd2g3MFlJL2dMdldSL0J1ejBnNEp6YUI2UFo4M1ErYm9QVHYKM1ZIS2xOWjlKQlhRTmtSc3N6U0dYWG5MYmtOTmNwVFg2cnAyZ1pUSS9NNDhGTnBxanAxOXRpQVg3bWN0cTl2SgpNejhvemhEcHZmSTlnMjFsNFZlRGdpbWEwTDVBc1pQbFdIQlZjcy9yL3dMU2YzWFVYZEs0UHpCQUdIRFBidXYrCnpKOVNqS0NFVll2bHRhMHlUUVBCSFJPa2Y2MG1sVmh6Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"server_key\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBc05QcWU5N0pWN3I5UjlqcUlvWlArRlkvaXNvSWQyMWlGNTdzTjVnYWc5ZUVWWFRPClRINVJyV09rT0NaVTh4MU1FQy9QWHp6M3YwT21tTzl4ZkZlVVdPQ0lkeGZ5SmhjalA4Z1F1ekFrUUljeHlYb3QKL00vM0hsTnhmVXNZU2RBMHlFWWJUcmIycEp3RUYzWkFKdGxYaEJyazB0NEczeW9ZS0paeXRzRzNCdGxzZVBtOAo1bk91UzJtWU04VXBUR2EzS2lBQUd4azFpRDhEQnhpOFRBRHdQZ0RlMU1mV21HZ1pkeStoNk1qTmREVVo5ejcyClRqRHhjWnBvL3lDK2JzM1d5L2E3cHRiRWUwVjNOVUU2ZkRhdUc3OWQvWndLMjZkR3ZVY0lrQzFBZjEyWHl4OHIKbXpSRVZTYzFSZVU5dm5VQTNSeE5RV1VYNTlSTlY0M3ZBelh0L0pWUnl2YTcyWXJnK0NGbjMvYUsxNGxoYkZ6NwpMeFp3TUxSTmJHbUNObE12MDB3WDZUTWk2ODNZMWRDdWZ2OGcxTURmL2hoOWQwNW5YTmxLNzEydE11bWNKMjJMCjJXY09rbnp2Q2FmbXBWRTFWczFWQ2RZUEtldC9QWXd3Snlaei92KzhFVHVBTE4zaEVwZXNxM0tIUEk4bjZ1dUgKRHFPcG8vd0w1bDEyajczK000OVBWSW03V0NaU2pXZUNFRFdHL3NMMFFYN2VVOU5jazFWYkNac1pYNG5Hb1lrbgpaR1NTSFpINTdrY01aQnlFVm5ZZXFrVXQ0L3NxUXVzQVoxMTFVOWNWb0lOdElQTkUvQUgxZGhxTWYxK2M5Y29RCjYrSk1Gb0JKeGdXa3luS3VicEVzWTkxRldyb1FKZFUvSFRzYTFvR0VTaFJ2VDU5VVdEZ3VZRXZIWlk4Q0F3RUEKQVFLQ0FnQVBUR1pQRFRsU004VlIvL3hSdkZrUzNUTm1LSkNPOUpHMkJYUGVZM1IzejUrTlhTdTBCb0craEk1aQpwVDVZUWtLZ2ErSi9GT0ZDVlBJRzdVQmVSNTE0Q3dVRGVMamtmci8zOXJFcjRNQmlMTkFyNUR3eVVUUEtGZUlOCnV2K0E4MWg5czBNTmpsck1ad3NibElsOFV2VjFZblpGb0J2c0Z0SThRTGZ3QTlaMzZ6dXRRNzRLR2h3TVBqaUMKMGgzK2xDeG9vcGdmd0JDWGx3d0dBeWZYVTRWMWQ5SFBpdktRQVFHakJDWDM0OWVTcEQxNDNLT21wQ2xmY01LQQp3QzU1bTZsbndCTUFIamlsaVo4RXBuNE8zUlEzSmxsVlpiaXl4RWdrZkE3TG1uNm9Ca3Jwc2VxdDVObThuRVhKCnBFbXhQcUl5Znc1WUNBMEhhNkM5WUhRN1RPRW9BbHBmWld4azAxSnpoVi9aK3FmVHM1YlMwQWNaTzFOVDRaeDgKWlF2eHQ0TDJINVcrK2R6RjhReTlidzQ2M3lKb1dydWxtNy9uQ3YvL1FpNGl0eHRnYyt0N2lwVXZzaUdTVktVWQpPelhCSXNWTUlnd0F6eUtTSEhPL21rMkEwVkgxaHB3emY2L0RzR2wxSjM4TU9pVGo4dEx1RWt3cFY4WGh5MnZwCkd0cXpsT21DS1hodlVDam9iZWlYSWJwSlIzeEM1NmliRjVadk0vQUdONzI5K0xKRFNwbHJtWVJRVHh1UTJWSE8KQWFXQ01SQWFBdUtCVnBxYTRjd25WRy9POEpkN2ZPSi9tMFlIN3FpRlJHREdvdVNOdHZJUUVtaXVkK3dRWjJ6dwpUcmFNVWk0SENtNEFPa0ZNVXBsRmt1ajA2ZHRqM2RIWUtPQkdMK25vaUp4WmJxb3kwUUtDQVFFQTFiZUl6WHh6CnRFRlp2OGRlOXljOWdCUUtNNUNIbHp6NUNMZXVkTitvemxxeDNCMW1PRStxbFkyaEd3RklIWVBJajFLYS83RlkKbExmNFpiUEJRMFhiNUo5VzQzSGIyTnEydXdRQ3ZiSXhVMW9zaGJVWlhZc2FUaE15azc2VzQ5YjU3UC9HdFE3NwpTbkVZTXNrTzRUQndyS3lBdVhDVHRtTk1Qa2J1NFBxT05PeVFQY3o3Yi92VEU1eERjMENMVS9oUXM3NWFHeCs1Citld2VjeEZNa0JKTVo2c2N5TzcySEdSNHZwTHduRXUvcU5uN2JmUElSaUx1T3BwTTdHNlUwQlBPL2todHJ5ZmQKV3U3MHJYZGJSdGRJUHlsQWxSOG9zczJqWWsrRHNPUnNESm9pbkk5WU1Va3dmdHdCNTRQbytGRGtGOHBzV202RQpSaklpenFBK0piWDlTd0tDQVFFQTA4Ly9oM0NabDg2M2xUZHNrU1JKRUZKc0RtdkZkUStzMWtlNUFwMjdnWTBXCmZJbEFGZFlRR3RORUVlTk9xS3EwdTFtS0lqWHFacWNTdU9DNzZIYTE5Tk9waHVoK1dwV0t2Ni9BTWtQSjE5SUIKQ3RqS0lkc2s0U2M3WG02MnNOV1pnQm5XT1Z3QVdzU0VzTHRac1NvWUJUVTJJS1pBOVJOWHhkSEQreGZ2SWJkNApZYngzTzk4WklNQzNlVFFiOW9jVHZab0RNWGdLaHRtTy9iMnlSeEVDSGpGRmxzYlhhc1RPeG5XOWZSVXJtdGVqCk9pdVlXaEZOM2R6dmpuVEdLY0xieWY0MWpHaUVUeFViUHVpei9ZMmk5NldCNVN6MW9zaGorRU1OaFhtRzZSYXUKQUIvelhwNldtSUJ2bDNpU0lzOGJRNkh3Qm1DTjc1R2VVVG1GUUlyaVRRS0NBUUVBbTkzWVN5MXA0VndNRGI5bApObElMRzM4Q0ZhdGlDRjR5cmpYd2FWSzVkWTVWeTFneHRmMzhSa2hkNkNrZUpGQjVsSFhGajVnVEo1dW84TnVSCnB2T3JOT2swNEhxb3dWWjZFSmtUT3JCY0l4TlFCMUFXS05BTHBrZUFDcHJreDFTQlFHVW0wZVFVUjYyRjNYd2YKZXdMdUdqRlJURzJiZlZpY1FZdFFLd3J4YmczZUFRU2ZtSU9MNVBDQmpPdlU4YS9YZzgvZlBZcjlBeFkrK3VMeAorTjB2bGlnSXZVN3lkYkNkRXpodGZVQU5qeU16cVhRemExdU1iWGNkaFEzOVFHaEIvZGhyRG1TL250Tko1YjEzCjk0bUpLbTkycDR0ckRrVEYxU3h5dWk5TjBqOFQ0U1QyU0RPOXg3ZkROOHRQdk5LYUYvUE01SU5YdXk1VGptajIKQ21EWlV3S0NBUUFOUVJYSFh1ZHRsWFR0ZEhOcHZiQ0l3ZStiRTJsZXd1VlkzMUlYZE5GWDhRRTROOHAzMDFaYwpwMTI2Rk5SR1A3QmhqTi9VOWpTOXliU2xOd0xyTUFxQTBJSHFQRUF6NE9tMnh3T3E0WTBPNFVoSmFubHpsdWYrCjR0cVhOU3hmY201UmtzeFIrSXpaSVRVQWJpalZxa0dvaWNUaVZDVDZjUVJzRDQxSStCMXhxYTV4eHo1YTA4SVoKeDVWemt5d3d5QkVYS3owSjZtNFdOQ1Q3Z2RSWEdCeGUwVXgrZStEZEFJWEQ2M2c1RElzVy9HbHRhVzcySytFSQpnaHZIZVUweExjMWRIWGd5V2hQMWN1ZXFqeHM4UVpHeUYzeENZQWJhOGRrM250S0l5S3NGaVBMSWRUZGdjMklQCkZ2SmtzeG5KN2RYUjdKODlkdXRLMDN6cHJrVEZYaXQ5QW9JQkFDcjhkb2ZCcFlFL1JuTlFwbVNET29DRm1sdTkKQlozN3h5K0puZ2FrQ2RSdHFyR1lDdkZMSnI2QnpGdXE0SHpsM0piTkRCM1BkYSs4Z2VNd2cxU1htTEhrRVFrTQpXV2ptNHpmU3hiTUtKamx3REdoeUlwSU9nQ2FQL1hyT2hxTGl4bnJ6UHFHZmM4R0FZTDE2Rm1PeGVqbVk5aERtCmNibkFqZlNwUjF1WEt2S2d6d1NLQ0VWdzc0VjJSRmRqQXBLVDl3bkpOQTZiWHQ5SXFkaS96d3BYbDQ0OVczdVMKNjRjVVpaK3luYnQ5QUlxbFNjMDdNRHl1TUtueExMbDFLeEJYenNxZlVsYWtlRGVoVmdGS05OOTNXQWJJc09ieAp1d1hTd0hXa1B6RGFHeE9wdzlSMHo2S2t2N25YZnBIYW1RWENBZEdsRjkyc1QwYW80Y3FuejFJSmJ2bz0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K\"\n }\n },\n {\n \"type\": \"certificate\",\n \"name\": \"cacert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjekNDQTF1Z0F3SUJBZ0lVVnNRZkFaTW4vazNRTU9nc0RuVEdUaU9PbGJ3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NURUxNQWtHQTFVRUJoTUNTVlF4RFRBTEJnTlZCQWdNQkVGemRHa3hFVEFQQmdOVkJBb01DRlJsYzNRZwpUR0ZpTVJnd0ZnWURWUVFEREE5MmJTMWliR0Z1YXk1bVppNXNZVzR3SGhjTk1qTXdOakE0TURrMU5EQTRXaGNOCk1qUXdOakEzTURrMU5EQTRXakJKTVFzd0NRWURWUVFHRXdKSlZERU5NQXNHQTFVRUNBd0VRWE4wYVRFUk1BOEcKQTFVRUNnd0lWR1Z6ZENCTVlXSXhHREFXQmdOVkJBTU1EM1p0TFdKc1lXNXJMbVptTG14aGJqQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMlQwWXpkcjB0dWQzaVJRNGNzaGNhRVJTRzVjTDE2CkhRblhoYWw4emlUL1VRQUNIUGdzZDYwcWlEaldvQTJXb0lGWFFpUHkzOG1vZGtWRlR4Qmt5U2VldndOOFJiLzEKOFhaMS8yS1RnVmRDcHkvNm11WE15bXZYODJad05CVkV3QnoxUk5kbklUSk44cVh3a0d4bHozbDBib1loRkFyUQpNdmkxcW1RaHpDa2Zpb041MVkrYlBXOXpTQlFQdXNrcXJYYzRqTTJ0VENNQ2pTcFlvd1hXM1ppRmc5WEJ1Z09aCjFmdWd1Zmw4K1FJYzNZSEFoL1Z1NloraXFEOGxQeGRKODlBeDZaazVtOGdkVG9JdUhBbUNWaHFpUXBGRjkzSTgKbkYrSnRuYnBaNTRJUTZBbWYrYiswakMxdmY4Kzg0WUppaEVzWExyaGMxZTRTZ2dwdzEvcWpDb21QblhGVjEzUwpsUG5kVlhVR0taa1ZKdXdZTjJyZElmd3YrdCs5MGhwUVBmNmFBTjRCamRxOXdkdkQzSXVnS2JYZG5CQ0FUTEY4ClYyRTFTSE9VZGdRY3duK1d1WDVVOGdPa3B2b2VFN0g1REJ6Rks1WTZ2SHZlaTRlNkp3RTRDK3FJL1BmbTgreTEKNEpsOFBSOW5JQmdGQ3hrZWpwa2tRQ0I5U0dvMVZidzZhWmdZd0VQNHh6YXFYYXV3L3F4c0oxNUkrRTBndEs1OApuWUtkM0hqelk5Slh6V0NVNTdXbmc2SzNvTTIzNXpyRzJnNm1FaHQ4SStDckVMUFNuZURjZU8zVlJkc2dlblBCCis4U1JxVU8vWG9LWHNEU3I5amoxdWluVzYwTG5MZ0Zmc3JQeGlQVlZlMFh1TFZESlhCSlNoRDZDeGRyMnBSOGQKS25SRDZrTFpZZEtMQWdNQkFBR2pVekJSTUIwR0ExVWREZ1FXQkJRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqVwpWREFmQmdOVkhTTUVHREFXZ0JRUzZnS2pMK3VFc0dXeXVjbTZyb0xVaXpqV1ZEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJad3B4Z2Z4N2thZFhvRHNyT1hUVXJ6dEFPMkFQRVJNaTAKaTkyNk9DTGFPbVVYZW1uKytXSUU1K2tUSE0wcS8vbUZCTURzSmdZSFVLUlNvRGNsNmh4TnVFNUNzS2trRVFTSgpMTHZrWlB0S2J5NGlxMitLZ1JtdVZxbXJNVTBYQzZMZDl3WmttL2huUjNtT3V6bko4MGZmV1JDQ0xGWDEwY2EzCnc5TGM1d1JLTFBZZXQvcEs5SitOYWN3TFJRYTczVFovMUpQNW9BU3czVjNoYkxlLy9UeWpnOURqUlZGY3FYWnEKWWs2Mm5qSkhZVzh3WmlhZzc0QXU4dHE5OG5KandBV1ROMFV5L2w1Q2VpWnV5bzZlU0RHVDNJNm1BdGU1VXBvWAppNXBkYlZ6VDdOZC9IOEwwZHZNdVZ2N0FmakZlcU91cUZNNkkzTnlvbStLWENxNmJQdGxBWEkzeVFZc0t4ZlRkCkw3SnRaTmx6MGJ6eHJhcHI4RmpYcjhML1ZkeHQza00xMnJwb2kzL3hsckR6Q2Q2b2YrQ1MxelBocUdpOUhvcUoKZEU5VGhYMklTdkd2akVSYzVVNFRsNjJBNHNyeGJQbUt0eWx3dGNGVEJacUJiRGY3ZjBBc2cveWhndXdTcktsQQpBNkRWVXVCRFErdGpwZ0N0b0ZlOEhLVDJ6UFVlaEQ2ZjVNQkhmU2ZUZ1crTlhFSXNvVDNsampjY1hsYXhPcFJWCkNQNWxCczNmekxyYnBxbUlLaWZhdWlTNWM4TzlSUjhjQTVzeWlBOTBmbmJIdDlmdGxpRG9jcFRzNUtrbjk2NkIKZUxMM1dXVldCYUtvanJzY1RkVXJoalNnVVBmam5FTXpnVzR2eEc3d3BVNHR2ME4yaEtHUWc0bVhhcDV0SU5Pcwp4WktnZXRHUldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -10755,7 +11396,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -10764,7 +11406,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\",\n \"authentication\": [\n {\n \"profile\": \"Basic authentication profile\"\n }\n ]\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\",\n \"authentication\": {\n \"server\": [\n {\n \"profile\": \"Bearer token-based authentication profile\"\n }\n ]\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"server\": [\n {\n \"name\": \"Bearer token-based authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU\",\n \"type\": \"bearer\"\n }\n },\n {\n \"name\": \"Header-based authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU\",\n \"type\": \"header\",\n \"location\": \"X-AUTH-TOKEN\"\n }\n },\n {\n \"name\": \"Basic authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"type\": \"basic\",\n \"username\": \"authusername\",\n \"password\": \"YXV0aHBhc3N3b3Jk\"\n }\n }\n ]\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\",\n \"authentication\": {\n \"server\": [\n {\n \"profile\": \"Bearer token-based authentication profile\"\n }\n ]\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"server\": [\n {\n \"name\": \"Bearer token-based authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU\",\n \"type\": \"bearer\"\n }\n },\n {\n \"name\": \"Header-based authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjAwMDEiLCJpc3MiOiJCYXNoIEpXVCBHZW5lcmF0b3IiLCJpYXQiOjE3MDI0ODEzNjcsImV4cCI6MTcwMjQ4MTM2OH0.eyJuYW1lIjoiQm9iIERldk9wcyIsInN1YiI6IkpXVCBzdWIgY2xhaW0iLCJpc3MiOiJKV1QgaXNzIGNsYWltIiwicm9sZXMiOlsiZGV2b3BzIl19.SKA_7MszAypMEtX5NDQ0TcUbVYx_Wt0hrtmuyTmrVKU\",\n \"type\": \"header\",\n \"location\": \"X-AUTH-TOKEN\"\n }\n },\n {\n \"name\": \"Basic authentication profile\",\n \"type\": \"token\",\n \"token\": {\n \"type\": \"basic\",\n \"username\": \"authusername\",\n \"password\": \"YXV0aHBhc3N3b3Jk\"\n }\n }\n ]\n }\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\",\n \"authentication\": [\n {\n \"profile\": \"Basic authentication profile\"\n }\n ]\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -10800,7 +11442,8 @@ "pm.collectionVariables.set('configUid',respData.configUid);" ], "type": "text/javascript", - "packages": {} + "packages": {}, + "requests": {} } } ], @@ -10809,7 +11452,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ],\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\",\n \"authentication\": [\n {\n \"profile\": \"Basic authentication profile\"\n }\n ]\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n },\n {\n \"type\": \"certificate\",\n \"name\": \"client_cert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZBakNDQStxZ0F3SUJBZ0lVYXZ1aFhBOWFLVFJlYmZ2Y1BFU2Z0MjBUQXhzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZqRUxNQWtHQTFVRUJoTUNTVVV4RFRBTEJnTlZCQWdNQkVOdmNtc3hEVEFMQmdOVkJBY01CRU52Y21zeApFVEFQQmdOVkJBb01DRUZqYldVZ1RIUmtNUll3RkFZRFZRUUREQTEwWlhOMExtRmpiV1F1YkdGdU1CNFhEVEkwCk1EUXhOVEUzTURnMU0xb1hEVEkxTURReE5URTNNRGcxTTFvd1dERUxNQWtHQTFVRUJoTUNTVVV4RFRBTEJnTlYKQkFnTUJFTnZjbXN4RFRBTEJnTlZCQWNNQkVOdmNtc3hFVEFQQmdOVkJBb01DRUZqYldVZ1RIUmtNUmd3RmdZRApWUVFEREE5amJHbGxiblF1WVdOdFpTNXNZV0l3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUURUQ2kydi8rc08rdTJTcFF5ZVBLM3hnb3RyRUlDZGJYMmN4N0xkcnRDbE82a0xTM3IybWpxV1ptWkQKUWkvL0dIZXhYS3NaelBURDUyN0ZMZlREcExIb2h1MldmeUErQy9HN2JycXlNT0dQZ3lVcEI2NWN2THU4V1BNOApPa3lxVFdma0xkRnF2akFGclU5czMxUnljT3BQSlB0cFloRWlhQXZRWDlwRnhjalM2NUJscUFCMjY1YnlncGs2CmpsV1E5NTVWUzlmZlNLU3hpQTRCQXAzMHV3Rm5YRWtMcGRCenI1TkFKeXJqdXhzbHJGVEs4SGxvRmQ2MndzQUMKRjYrRGZmQ2FNLzVockljRkswSVFheHBpaWUyWllKaVFmNXJMeVd6VG1xMVh1QmsyaEhBWDNvQUY2bW9hcnVNOAo5UlhxQmlaNnFWdGFPQXFEK0pRVGNpYmVzekQ2Z2xoSitGM0VFTEJOWVhETmFLbGprQXRxVWFwYStXZEdVUkU4CnZvczA4TSsvOUlhWTdQeGtQNXB6bDhmaS9RaS9ESW9WLzh0UUlydFBIYzJqSTFSRkZoL3BpeDFsR2lyTlRBK0QKbTlURDJKT0hTU3VmdkRkRnV1YjFwMnF5TW5Nd3FFNklHOGpmTEg2TGNxRGFSbmcveVpVUTBqa01LSFYrd1gwegpkZ1RsMDVVWjZtMFpFNUdlK1FRaG5nY0FUemdrSWp3WlJod1JLOEx1Nmtwb2Vnb0dMUkhkTVNqcUV0NkNWc25BCmFLZ0hTbTJROE9MS1lJdlhVN1RpME9DNm5OdU40RDlKdkxGQXdPMUVFU2tCUXFQeThGby8zRVNZWU1FazJ6RzQKc3I0UXJ4Q2xuY2pwbUMrdkRmdHJuR055SVJvditOeS9zd2FSdkcvcm15ZnhEYVdNL3dJREFRQUJvNEhGTUlIQwpNQWtHQTFVZEV3UUNNQUF3RVFZSllJWklBWWI0UWdFQkJBUURBZ1dnTURNR0NXQ0dTQUdHK0VJQkRRUW1GaVJQCmNHVnVVMU5NSUVkbGJtVnlZWFJsWkNCRGJHbGxiblFnUTJWeWRHbG1hV05oZEdVd0hRWURWUjBPQkJZRUZGQmIKdmltZDYxekxLdlA0U2RZRFRWbndYdFVwTUI4R0ExVWRJd1FZTUJhQUZLY29GRHpMVnc1QXBiMzB5UTM0c25MZQpHQ1FWTUE0R0ExVWREd0VCL3dRRUF3SUY0REFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVICkF3UXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSmg0cm9kZEVGemJwWk5kSW5zUmdubWVnWVIxSWlzUUxRU0IKcmNydEZxVmtLb3Rsc09EUXBFMThIRjBsbVA4WE9IU0hqYytYUVF5YlFNd1ViZ2RNbnhBZE1WaGFaMXppWElnaQpiUHgwOEY0YXR5MElJY1hyOVpFVnZTd1pheURBZHErb2s5RGpoRjQwYU5iQmFBTXB2NTRCL2U3OUNMSWZ6REo4CnNZaWw3K09abWlOUTJtZUNreVBYdXdhd3hTeVRnNVhWS3Q4VEtKQVJ5aTFJeWRHWkZRMTJGWFJHTE1BSjdaYngKRzlPd1ZvazExenpWNkRQZHFuZU5ER3BQRU5WZ2VmVjI0ZU1JVXUrYzhnSThYTU1GMU9VVWR3MmlEQmU4Q01TQQppc2h2aDFWYVZPNC96czlma2dLV2FXejNwQWprN3pkbWdaUnpXRUVHR0JMekJoQk5FQTg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"client_key\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRRFRDaTJ2LytzTyt1MlMKcFF5ZVBLM3hnb3RyRUlDZGJYMmN4N0xkcnRDbE82a0xTM3IybWpxV1ptWkRRaS8vR0hleFhLc1p6UFRENTI3RgpMZlREcExIb2h1MldmeUErQy9HN2JycXlNT0dQZ3lVcEI2NWN2THU4V1BNOE9reXFUV2ZrTGRGcXZqQUZyVTlzCjMxUnljT3BQSlB0cFloRWlhQXZRWDlwRnhjalM2NUJscUFCMjY1YnlncGs2amxXUTk1NVZTOWZmU0tTeGlBNEIKQXAzMHV3Rm5YRWtMcGRCenI1TkFKeXJqdXhzbHJGVEs4SGxvRmQ2MndzQUNGNitEZmZDYU0vNWhySWNGSzBJUQpheHBpaWUyWllKaVFmNXJMeVd6VG1xMVh1QmsyaEhBWDNvQUY2bW9hcnVNODlSWHFCaVo2cVZ0YU9BcUQrSlFUCmNpYmVzekQ2Z2xoSitGM0VFTEJOWVhETmFLbGprQXRxVWFwYStXZEdVUkU4dm9zMDhNKy85SWFZN1B4a1A1cHoKbDhmaS9RaS9ESW9WLzh0UUlydFBIYzJqSTFSRkZoL3BpeDFsR2lyTlRBK0RtOVREMkpPSFNTdWZ2RGRGdXViMQpwMnF5TW5Nd3FFNklHOGpmTEg2TGNxRGFSbmcveVpVUTBqa01LSFYrd1gwemRnVGwwNVVaNm0wWkU1R2UrUVFoCm5nY0FUemdrSWp3WlJod1JLOEx1Nmtwb2Vnb0dMUkhkTVNqcUV0NkNWc25BYUtnSFNtMlE4T0xLWUl2WFU3VGkKME9DNm5OdU40RDlKdkxGQXdPMUVFU2tCUXFQeThGby8zRVNZWU1FazJ6RzRzcjRRcnhDbG5janBtQyt2RGZ0cgpuR055SVJvditOeS9zd2FSdkcvcm15ZnhEYVdNL3dJREFRQUJBb0lDQUJzWEZBK2krRmVFbW5rdE9xdHRUL1FsCk5TUlozL05WYjJuRlcyUGRqRHhKcGtUTzV2VS9qYThVd2ZmTVIrdWxCbWhSWkVmOFBweVBMc2J5USszV29iSjAKUk9JQlprVjdYd2ZDWDdEVUJDc0VtS3ZscDlvN3JVQmJqV0w1SmpJNDhYeDI3VFR0NlFMY05uVXhUZDUxanRPagpXYXFJdzNqNU1Oc0tFdDRncWlET2RhQzIvMzJaekZkTHNHNWdnRmRnUElZOUpYUXN3bHk2VnZjdzVpU0RoTnRICkcyYWxYYXdiL2s1Sk9OWTIyY3RDT0kyUnhPUGtPc3lYRkoxYTBRQStGYmxBWExKenVubE5ZNU9iOXEwWTFpa2sKSHpGeXBUcENSdmY2dzY3em00NUYvZVdkS0MzdmpnM29JK29GUS9vMTJUdjhWV3Bhc0ptSmoraUJ5aFRpOGx4YQpMempXaHNrUFZJUGJDYjFDTmIzZHNQSWVWYTVQYmRORGh2bHBQZFV4cXhKRGI4ZUFhemxSQXJVdmtaQnpkTjZtCjVwekljNGtMQnd3Wno5eGg1MzdsQ0tlZ3ZJYmdEMlQvMEM4SVFsWmFIK1M3azlWaVU2Z1RWSGNzU1RsSm52NVYKN3VCMWczVzJZRVloZFJxNlJOUXRZaUFuTktUS2ZYb3d1UUJteWRwVWRYWUljTE5GcER6eHgvRGdQSEhnU0J1dQpQZXVMZzdpemhSSndKMTQ1eW5VTlloQnROVVJaOWlRL1cwWTJOa242UWFBZDNld1pLaVg0S3lZU2k3TTF1MFJWCmFDc1BmZWJrWkRTUnRnQ2Q5N3dGSVYyTVh0UnpXNlpKUUlDWkhHTDVkYkJrNU0xQTI2NnJSYmcvTWZJSE9mdTMKRUZBVjc2aXoyVmNtSDRzblNZUHhBb0lCQVFEc0pNWElhM3ZyRXdRSkh0alRWZE9ONk9rbEExRVN4aWtjSWdSOAo3aFRWQXk3dmtORlpFVUhYczQ1TXlYQzRxTWlvUnFhZHVtOXpQWnFBQ0tQMHRWcXdDMVdOcUFrbDBQc1pZYXcrCmpKNjRDQXA4ZnJ4UDUrOVpWREtiamRWK1ZrK1lrbC9UL0Q1djNFTnZIdkVxN3ZMSE56dE9VSmFWZXNFRERQSW8KaER5SHhjRXQwTHRXTFhoNGNMSDhIQk9Kc0wxYXcxRlhNTk1qdERzazlBMTlJRFlYTHcwaWpIeC81c3hHUGcxSQpmMXRIemhpTlN5NUU5RG9pTmJxVFQvWEEyYVdCdjJ1ZlQybmw2ekticHZHNVo0VGlOUE5ESU5MaUFXOVNNQnJnCkJtaXJFVHU4MnVSa3hnaWZTM01CZ0ZFdXVtaSt2cEhwNzhGaUNOcHpZZUFwTUxjN0FvSUJBUURreVFVT29HVjEKTzZaNXJ4KzhLbVh1S3dmbXNHNmh5cmkrNEw4MzRQakVhbHdkdFhFUmphUG8vSTVhOVFoYjNnLzF5SUdiMzdLSgpPaTFCcGVRZ1owUEVQdFgyRWI0QTNCSTA5SzExWWFybnJGM2d6WS9CVWgveEZoL1YvVEVzTTloZTZ4YlhtRm9WCktvMlY1b2NlNnQzNUJuNHVLL2xkSEJKMHJnUENQdXNKVU9JMEhtUzZkdXNQcHczRFpESkZ5SEU4anptSllwcUsKMnBEMlBBMVZ5aVBBM3MwOU12TWdNSmJXajJLQVBoYk4xQXJnTERaUTFuZ0VwaVFtM3hWdmxIVkMzN0JHM0IzcApWbmtSRE9UZnF1N1BXek40aHZnMDRaNkxBdEZuYzNnMFFxRGcvcXZlS0xuclZwOUJEUlhWb0pZZkNMaVBkajZCCmFiYnFXQ0lYTnMwTkFvSUJBUURFWllrQk9UT2t2UG44UStWOVRzSldJa0hWZ0w2cTZKaEVSNTZIOE5MdW5ta28KNGI3Ylh0anQ5dTRBdXdDKzg5Ris4dE9jRnZTZVdidm5oRWdvTzdTaSthbzcyR2RUUmsyd1BHV3UxL0VoaWI1Kwo4RURhREVJcWZ6WmYzVVNVZ0dCT3VsNXN4anQvZVNlMGdYMStnYUQxUXVCV0wvd3RjaHlZMXVtSC9RTUN3TnY3CnFNQkYyaWQ1cy9Demh2NVE0K2Q0VnoyTlVKUXArN204OENWUHpieHU1N2o2NVBDZXgydFplRDQvNzN3UmFqMU4KTmh2VFNYUVlBNnVhM1VPOUVzYnQ5REFrSFQ0cjlNTHdaWlpnNXRIRCtObmhHS21MUWpvOWxyaWpYWEVyNVhkVAppSkd2cG15Qlg1VFV5TTI4R1ZrSVd5S3I5N1ZVUFp6Qm5jTjdQb01GQW9JQkFDSWRCekFESXAyMFkwSkpwb1c4CkhLN0NvODcyQjhrQUhVUDQ1d3BCOVZYME5nQUlDZkFBR3F5bTIrTWNIajcwZ1pTNGJQcjlBL1lLUXExRE94ekoKeVFUK0NaRkRXLzFzMHhvcVVhTHJDVHk2S3RWV1VWVVdGY1V3ODFaSkJvZjh3d3FFSzBmQ1k4dzhLQmh0NHovcwo3V1F3WDZncXptZmZ3N0M2TWIxSS9HckxNSzlzeU1BMDh4L0dYUHNCZWEyR0VieGg3c1paZVlteXhXS3gyWnN0CkpOK2hXU0VDODlXYzZTRGRDR2J1MngrZHVuRnFwajZ2ZS8zVmVCYUR0UUtLTkdIZ1VMeUFIY1dwS3l3cnJBVGQKeS9ZSE4wbUZkb1VNRDBQVEM3NU5MV005ZkJlUVliZ2lnblpnMkNZdStVNTlQMlVwTzd2SWVkRjZIZGdiaEJuSwpCaEVDZ2dFQkFNZmQ2Zi90RThTQlNFUnd5YW80SThuZkhTZUlMUklvM3pqRE5vWHZ6VHlwbG00a3ovYW9QeEF0CmhPYVNmZU41bFljMXFFUkRxZzRIVGRNTUkyenZPaVFuMHNGTEJFZ0UwT0VIOEZxZVZlZGgycUJucFdXWEhwTW8KREd4TnhpUnVpSDZpOEVMVWFoaU1NQkdQVi9ONjI5MDREbnUyYVVHcHlMTzZxems3SmM5VXlITC90QVNRTFIzagp6NFBhb2xTRE5rNzJSUks0VjIyZUprM2EwYVhjRU5vM1R0OUlTUTliMG5DYVVKbFJsZTA0d2QrOWUyN0FRNUNaCkVWbUtZT1JYcW9VTGNQOEcxRm1VUGhDRkU2aEI3L1hSVWpQdmJFdm5rS05Cdko2UHppT0RMdktRK3I4TzR0WkMKQi9LTDlCdjNmdUkvQlJLeU9WZVU1VnZ5MzUveUFxVT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=\"\n }\n }\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\",\n \"authentication\": {\n \"server\": [\n {\n \"profile\": \"mTLS authentication profile\"\n }\n ]\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"server\": [\n {\n \"name\": \"mTLS authentication profile\",\n \"type\": \"mtls\",\n \"mtls\": {\n \"certificate\": \"client_cert\",\n \"key\": \"client_key\"\n }\n }\n ]\n }\n }\n }\n}", + "raw": "{\n \"output\": {\n \"type\": \"nginxone\",\n \"nginxone\": {\n \"url\": \"{{nginxone_url}}\",\n \"namespace\": \"{{nginxone_namespace}}\",\n \"token\": \"{{nginxone_token}}\",\n \"configsyncgroup\": \"{{nginxone_configsyncgroup}}\",\n \"synctime\": 0,\n \"modules\": [\n \"ngx_http_js_module\",\n \"ngx_stream_js_module\"\n ]\n },\n \"license\": {\n \"endpoint\": \"{{nginx_reporting_server}}\",\n \"token\": \"{{nginx_license_token}}\",\n \"ssl_verify\": false,\n \"grace_period\": false\n }\n },\n \"declaration\": {\n \"http\": {\n \"servers\": [\n {\n \"name\": \"Online boutique HTTPS\",\n \"names\": [\n \"www.online-boutique.lan\"\n ],\n \"listen\": {\n \"address\": \"0.0.0.0:443\",\n \"http2\": true,\n \"tls\": {\n \"certificate\": \"test_cert\",\n \"key\": \"test_key\",\n \"ciphers\": \"DEFAULT\",\n \"protocols\": [\n \"TLSv1.2\",\n \"TLSv1.3\"\n ]\n }\n },\n \"log\": {\n \"access\": {\n \"destination\": \"/var/log/nginx/server-access.log\"\n },\n \"error\": {\n \"destination\": \"/var/log/nginx/server-error.log\"\n }\n },\n \"locations\": [\n {\n \"uri\": \"/\",\n \"urimatch\": \"prefix\",\n \"upstream\": \"http://upstream_boutique\",\n \"authentication\": {\n \"server\": [\n {\n \"profile\": \"mTLS authentication profile\"\n }\n ]\n }\n }\n ]\n }\n ],\n \"upstreams\": [\n {\n \"name\": \"upstream_boutique\",\n \"origin\": [\n {\n \"server\": \"192.168.2.200:80\"\n }\n ]\n }\n ],\n \"authentication\": {\n \"server\": [\n {\n \"name\": \"mTLS authentication profile\",\n \"type\": \"mtls\",\n \"mtls\": {\n \"certificate\": \"client_cert\",\n \"key\": \"client_key\"\n }\n }\n ]\n }\n },\n \"certificates\": [\n {\n \"type\": \"certificate\",\n \"name\": \"test_cert\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.crt\",\n \"authentication\": [\n {\n \"profile\": \"Basic authentication profile\"\n }\n ]\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"test_key\",\n \"contents\": {\n \"content\": \"{{github_gitops_root}}/{{ngc_api_version}}/testcert.key\"\n }\n },\n {\n \"type\": \"certificate\",\n \"name\": \"client_cert\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZBakNDQStxZ0F3SUJBZ0lVYXZ1aFhBOWFLVFJlYmZ2Y1BFU2Z0MjBUQXhzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1ZqRUxNQWtHQTFVRUJoTUNTVVV4RFRBTEJnTlZCQWdNQkVOdmNtc3hEVEFMQmdOVkJBY01CRU52Y21zeApFVEFQQmdOVkJBb01DRUZqYldVZ1RIUmtNUll3RkFZRFZRUUREQTEwWlhOMExtRmpiV1F1YkdGdU1CNFhEVEkwCk1EUXhOVEUzTURnMU0xb1hEVEkxTURReE5URTNNRGcxTTFvd1dERUxNQWtHQTFVRUJoTUNTVVV4RFRBTEJnTlYKQkFnTUJFTnZjbXN4RFRBTEJnTlZCQWNNQkVOdmNtc3hFVEFQQmdOVkJBb01DRUZqYldVZ1RIUmtNUmd3RmdZRApWUVFEREE5amJHbGxiblF1WVdOdFpTNXNZV0l3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUURUQ2kydi8rc08rdTJTcFF5ZVBLM3hnb3RyRUlDZGJYMmN4N0xkcnRDbE82a0xTM3IybWpxV1ptWkQKUWkvL0dIZXhYS3NaelBURDUyN0ZMZlREcExIb2h1MldmeUErQy9HN2JycXlNT0dQZ3lVcEI2NWN2THU4V1BNOApPa3lxVFdma0xkRnF2akFGclU5czMxUnljT3BQSlB0cFloRWlhQXZRWDlwRnhjalM2NUJscUFCMjY1YnlncGs2CmpsV1E5NTVWUzlmZlNLU3hpQTRCQXAzMHV3Rm5YRWtMcGRCenI1TkFKeXJqdXhzbHJGVEs4SGxvRmQ2MndzQUMKRjYrRGZmQ2FNLzVockljRkswSVFheHBpaWUyWllKaVFmNXJMeVd6VG1xMVh1QmsyaEhBWDNvQUY2bW9hcnVNOAo5UlhxQmlaNnFWdGFPQXFEK0pRVGNpYmVzekQ2Z2xoSitGM0VFTEJOWVhETmFLbGprQXRxVWFwYStXZEdVUkU4CnZvczA4TSsvOUlhWTdQeGtQNXB6bDhmaS9RaS9ESW9WLzh0UUlydFBIYzJqSTFSRkZoL3BpeDFsR2lyTlRBK0QKbTlURDJKT0hTU3VmdkRkRnV1YjFwMnF5TW5Nd3FFNklHOGpmTEg2TGNxRGFSbmcveVpVUTBqa01LSFYrd1gwegpkZ1RsMDVVWjZtMFpFNUdlK1FRaG5nY0FUemdrSWp3WlJod1JLOEx1Nmtwb2Vnb0dMUkhkTVNqcUV0NkNWc25BCmFLZ0hTbTJROE9MS1lJdlhVN1RpME9DNm5OdU40RDlKdkxGQXdPMUVFU2tCUXFQeThGby8zRVNZWU1FazJ6RzQKc3I0UXJ4Q2xuY2pwbUMrdkRmdHJuR055SVJvditOeS9zd2FSdkcvcm15ZnhEYVdNL3dJREFRQUJvNEhGTUlIQwpNQWtHQTFVZEV3UUNNQUF3RVFZSllJWklBWWI0UWdFQkJBUURBZ1dnTURNR0NXQ0dTQUdHK0VJQkRRUW1GaVJQCmNHVnVVMU5NSUVkbGJtVnlZWFJsWkNCRGJHbGxiblFnUTJWeWRHbG1hV05oZEdVd0hRWURWUjBPQkJZRUZGQmIKdmltZDYxekxLdlA0U2RZRFRWbndYdFVwTUI4R0ExVWRJd1FZTUJhQUZLY29GRHpMVnc1QXBiMzB5UTM0c25MZQpHQ1FWTUE0R0ExVWREd0VCL3dRRUF3SUY0REFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVICkF3UXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSmg0cm9kZEVGemJwWk5kSW5zUmdubWVnWVIxSWlzUUxRU0IKcmNydEZxVmtLb3Rsc09EUXBFMThIRjBsbVA4WE9IU0hqYytYUVF5YlFNd1ViZ2RNbnhBZE1WaGFaMXppWElnaQpiUHgwOEY0YXR5MElJY1hyOVpFVnZTd1pheURBZHErb2s5RGpoRjQwYU5iQmFBTXB2NTRCL2U3OUNMSWZ6REo4CnNZaWw3K09abWlOUTJtZUNreVBYdXdhd3hTeVRnNVhWS3Q4VEtKQVJ5aTFJeWRHWkZRMTJGWFJHTE1BSjdaYngKRzlPd1ZvazExenpWNkRQZHFuZU5ER3BQRU5WZ2VmVjI0ZU1JVXUrYzhnSThYTU1GMU9VVWR3MmlEQmU4Q01TQQppc2h2aDFWYVZPNC96czlma2dLV2FXejNwQWprN3pkbWdaUnpXRUVHR0JMekJoQk5FQTg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\"\n }\n },\n {\n \"type\": \"key\",\n \"name\": \"client_key\",\n \"contents\": {\n \"content\": \"LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRRFRDaTJ2LytzTyt1MlMKcFF5ZVBLM3hnb3RyRUlDZGJYMmN4N0xkcnRDbE82a0xTM3IybWpxV1ptWkRRaS8vR0hleFhLc1p6UFRENTI3RgpMZlREcExIb2h1MldmeUErQy9HN2JycXlNT0dQZ3lVcEI2NWN2THU4V1BNOE9reXFUV2ZrTGRGcXZqQUZyVTlzCjMxUnljT3BQSlB0cFloRWlhQXZRWDlwRnhjalM2NUJscUFCMjY1YnlncGs2amxXUTk1NVZTOWZmU0tTeGlBNEIKQXAzMHV3Rm5YRWtMcGRCenI1TkFKeXJqdXhzbHJGVEs4SGxvRmQ2MndzQUNGNitEZmZDYU0vNWhySWNGSzBJUQpheHBpaWUyWllKaVFmNXJMeVd6VG1xMVh1QmsyaEhBWDNvQUY2bW9hcnVNODlSWHFCaVo2cVZ0YU9BcUQrSlFUCmNpYmVzekQ2Z2xoSitGM0VFTEJOWVhETmFLbGprQXRxVWFwYStXZEdVUkU4dm9zMDhNKy85SWFZN1B4a1A1cHoKbDhmaS9RaS9ESW9WLzh0UUlydFBIYzJqSTFSRkZoL3BpeDFsR2lyTlRBK0RtOVREMkpPSFNTdWZ2RGRGdXViMQpwMnF5TW5Nd3FFNklHOGpmTEg2TGNxRGFSbmcveVpVUTBqa01LSFYrd1gwemRnVGwwNVVaNm0wWkU1R2UrUVFoCm5nY0FUemdrSWp3WlJod1JLOEx1Nmtwb2Vnb0dMUkhkTVNqcUV0NkNWc25BYUtnSFNtMlE4T0xLWUl2WFU3VGkKME9DNm5OdU40RDlKdkxGQXdPMUVFU2tCUXFQeThGby8zRVNZWU1FazJ6RzRzcjRRcnhDbG5janBtQyt2RGZ0cgpuR055SVJvditOeS9zd2FSdkcvcm15ZnhEYVdNL3dJREFRQUJBb0lDQUJzWEZBK2krRmVFbW5rdE9xdHRUL1FsCk5TUlozL05WYjJuRlcyUGRqRHhKcGtUTzV2VS9qYThVd2ZmTVIrdWxCbWhSWkVmOFBweVBMc2J5USszV29iSjAKUk9JQlprVjdYd2ZDWDdEVUJDc0VtS3ZscDlvN3JVQmJqV0w1SmpJNDhYeDI3VFR0NlFMY05uVXhUZDUxanRPagpXYXFJdzNqNU1Oc0tFdDRncWlET2RhQzIvMzJaekZkTHNHNWdnRmRnUElZOUpYUXN3bHk2VnZjdzVpU0RoTnRICkcyYWxYYXdiL2s1Sk9OWTIyY3RDT0kyUnhPUGtPc3lYRkoxYTBRQStGYmxBWExKenVubE5ZNU9iOXEwWTFpa2sKSHpGeXBUcENSdmY2dzY3em00NUYvZVdkS0MzdmpnM29JK29GUS9vMTJUdjhWV3Bhc0ptSmoraUJ5aFRpOGx4YQpMempXaHNrUFZJUGJDYjFDTmIzZHNQSWVWYTVQYmRORGh2bHBQZFV4cXhKRGI4ZUFhemxSQXJVdmtaQnpkTjZtCjVwekljNGtMQnd3Wno5eGg1MzdsQ0tlZ3ZJYmdEMlQvMEM4SVFsWmFIK1M3azlWaVU2Z1RWSGNzU1RsSm52NVYKN3VCMWczVzJZRVloZFJxNlJOUXRZaUFuTktUS2ZYb3d1UUJteWRwVWRYWUljTE5GcER6eHgvRGdQSEhnU0J1dQpQZXVMZzdpemhSSndKMTQ1eW5VTlloQnROVVJaOWlRL1cwWTJOa242UWFBZDNld1pLaVg0S3lZU2k3TTF1MFJWCmFDc1BmZWJrWkRTUnRnQ2Q5N3dGSVYyTVh0UnpXNlpKUUlDWkhHTDVkYkJrNU0xQTI2NnJSYmcvTWZJSE9mdTMKRUZBVjc2aXoyVmNtSDRzblNZUHhBb0lCQVFEc0pNWElhM3ZyRXdRSkh0alRWZE9ONk9rbEExRVN4aWtjSWdSOAo3aFRWQXk3dmtORlpFVUhYczQ1TXlYQzRxTWlvUnFhZHVtOXpQWnFBQ0tQMHRWcXdDMVdOcUFrbDBQc1pZYXcrCmpKNjRDQXA4ZnJ4UDUrOVpWREtiamRWK1ZrK1lrbC9UL0Q1djNFTnZIdkVxN3ZMSE56dE9VSmFWZXNFRERQSW8KaER5SHhjRXQwTHRXTFhoNGNMSDhIQk9Kc0wxYXcxRlhNTk1qdERzazlBMTlJRFlYTHcwaWpIeC81c3hHUGcxSQpmMXRIemhpTlN5NUU5RG9pTmJxVFQvWEEyYVdCdjJ1ZlQybmw2ekticHZHNVo0VGlOUE5ESU5MaUFXOVNNQnJnCkJtaXJFVHU4MnVSa3hnaWZTM01CZ0ZFdXVtaSt2cEhwNzhGaUNOcHpZZUFwTUxjN0FvSUJBUURreVFVT29HVjEKTzZaNXJ4KzhLbVh1S3dmbXNHNmh5cmkrNEw4MzRQakVhbHdkdFhFUmphUG8vSTVhOVFoYjNnLzF5SUdiMzdLSgpPaTFCcGVRZ1owUEVQdFgyRWI0QTNCSTA5SzExWWFybnJGM2d6WS9CVWgveEZoL1YvVEVzTTloZTZ4YlhtRm9WCktvMlY1b2NlNnQzNUJuNHVLL2xkSEJKMHJnUENQdXNKVU9JMEhtUzZkdXNQcHczRFpESkZ5SEU4anptSllwcUsKMnBEMlBBMVZ5aVBBM3MwOU12TWdNSmJXajJLQVBoYk4xQXJnTERaUTFuZ0VwaVFtM3hWdmxIVkMzN0JHM0IzcApWbmtSRE9UZnF1N1BXek40aHZnMDRaNkxBdEZuYzNnMFFxRGcvcXZlS0xuclZwOUJEUlhWb0pZZkNMaVBkajZCCmFiYnFXQ0lYTnMwTkFvSUJBUURFWllrQk9UT2t2UG44UStWOVRzSldJa0hWZ0w2cTZKaEVSNTZIOE5MdW5ta28KNGI3Ylh0anQ5dTRBdXdDKzg5Ris4dE9jRnZTZVdidm5oRWdvTzdTaSthbzcyR2RUUmsyd1BHV3UxL0VoaWI1Kwo4RURhREVJcWZ6WmYzVVNVZ0dCT3VsNXN4anQvZVNlMGdYMStnYUQxUXVCV0wvd3RjaHlZMXVtSC9RTUN3TnY3CnFNQkYyaWQ1cy9Demh2NVE0K2Q0VnoyTlVKUXArN204OENWUHpieHU1N2o2NVBDZXgydFplRDQvNzN3UmFqMU4KTmh2VFNYUVlBNnVhM1VPOUVzYnQ5REFrSFQ0cjlNTHdaWlpnNXRIRCtObmhHS21MUWpvOWxyaWpYWEVyNVhkVAppSkd2cG15Qlg1VFV5TTI4R1ZrSVd5S3I5N1ZVUFp6Qm5jTjdQb01GQW9JQkFDSWRCekFESXAyMFkwSkpwb1c4CkhLN0NvODcyQjhrQUhVUDQ1d3BCOVZYME5nQUlDZkFBR3F5bTIrTWNIajcwZ1pTNGJQcjlBL1lLUXExRE94ekoKeVFUK0NaRkRXLzFzMHhvcVVhTHJDVHk2S3RWV1VWVVdGY1V3ODFaSkJvZjh3d3FFSzBmQ1k4dzhLQmh0NHovcwo3V1F3WDZncXptZmZ3N0M2TWIxSS9HckxNSzlzeU1BMDh4L0dYUHNCZWEyR0VieGg3c1paZVlteXhXS3gyWnN0CkpOK2hXU0VDODlXYzZTRGRDR2J1MngrZHVuRnFwajZ2ZS8zVmVCYUR0UUtLTkdIZ1VMeUFIY1dwS3l3cnJBVGQKeS9ZSE4wbUZkb1VNRDBQVEM3NU5MV005ZkJlUVliZ2lnblpnMkNZdStVNTlQMlVwTzd2SWVkRjZIZGdiaEJuSwpCaEVDZ2dFQkFNZmQ2Zi90RThTQlNFUnd5YW80SThuZkhTZUlMUklvM3pqRE5vWHZ6VHlwbG00a3ovYW9QeEF0CmhPYVNmZU41bFljMXFFUkRxZzRIVGRNTUkyenZPaVFuMHNGTEJFZ0UwT0VIOEZxZVZlZGgycUJucFdXWEhwTW8KREd4TnhpUnVpSDZpOEVMVWFoaU1NQkdQVi9ONjI5MDREbnUyYVVHcHlMTzZxems3SmM5VXlITC90QVNRTFIzagp6NFBhb2xTRE5rNzJSUks0VjIyZUprM2EwYVhjRU5vM1R0OUlTUTliMG5DYVVKbFJsZTA0d2QrOWUyN0FRNUNaCkVWbUtZT1JYcW9VTGNQOEcxRm1VUGhDRkU2aEI3L1hSVWpQdmJFdm5rS05Cdko2UHppT0RMdktRK3I4TzR0WkMKQi9LTDlCdjNmdUkvQlJLeU9WZVU1VnZ5MzUveUFxVT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=\"\n }\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -10887,6 +11530,26 @@ } ], "description": "[https://github.com/f5devcentral/NGINX-Declarative-API/blob/main/USAGE-v5.0.md](https://github.com/f5devcentral/NGINX-Declarative-API/blob/main/USAGE-v4.2.md)" + }, + { + "name": "Get API schema", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://{{ncg_host}}:{{ncg_port}}/{{ngc_api_version}}/schema", + "protocol": "http", + "host": [ + "{{ncg_host}}" + ], + "port": "{{ncg_port}}", + "path": [ + "{{ngc_api_version}}", + "schema" + ] + } + }, + "response": [] } ], "event": [ diff --git a/contrib/postman/README.md b/contrib/postman/README.md index 518bf304..624c97cc 100644 --- a/contrib/postman/README.md +++ b/contrib/postman/README.md @@ -2,5 +2,5 @@ This collection contains several declaration examples for the following NGINX Declarative API releases: -* v5.5 - latest -* v5.4 - stable +* v5.6 - latest +* v5.5 - stable diff --git a/etc/config.toml b/etc/config.toml deleted file mode 100644 index fac783b8..00000000 --- a/etc/config.toml +++ /dev/null @@ -1,90 +0,0 @@ -# NGINX Declarative API - https://github.com/f5devcentral/NGINX-Declarative-API/ - -# Main variables -[main] -banner = "NGINX Declarative API" -version = "5.5.0" -url = "https://github.com/f5devcentral/NGINX-Declarative-API" - -# Templates -[templates] -root_dir = "../templates" -nginxmain = "nginx-conf/nginx.conf" -mimetypes = "nginx-conf/mime.types" -license = "nginx-conf/license-key.tmpl" - -httpconf = "http.tmpl" -apigwconf = "apigateway.tmpl" -apigwmapsconf = "apigateway-maps.tmpl" -visibility_root = "visibility" -streamconf = "stream.tmpl" -configmap = "configmap.tmpl" -resolver = "misc/resolver.tmpl" - -server_http = "misc/server-http.tmpl" -server_stream = "misc/server-stream.tmpl" - -upstream_http = "misc/upstream-http.tmpl" -upstream_stream = "misc/upstream-stream.tmpl" - -auth_client_root = "authn/client" -auth_server_root = "authn/server" - -authz_client_root = "authz/client" - -acme_issuer = "misc/acme.tmpl" - -devportal_root = "devportal" -misc_root = "misc" - -# NGINX Declarative API Server -[apiserver] -host = "0.0.0.0" -port = 5000 - -# Redis backend -[redis] -host = "redis" -port = 6379 - -# Redocly devportal helper -[devportal] -host = "devportal" -port = 5000 -uri = "/v1/devportal" - -# Staged configuration directories -[nms] -config_dir = '/etc/nginx' -certs_dir = '/etc/nginx/ssl' -acme_dir = '/etc/nginx/acme' -apigw_dir = '/etc/nginx/apigateway' -apigw_maps_dir = '/etc/nginx/apigateway/maps' -visibility_dir = '/etc/nginx/visibility' -devportal_dir = '/etc/nginx/devportal' -auth_client_dir = '/etc/nginx/authn/client' -auth_server_dir = '/etc/nginx/authn/server' -authz_client_dir = '/etc/nginx/authz/client' -njs_dir = '/etc/nginx/njs' -resolver_dir = '/etc/nginx/resolvers' -server_http_dir = '/etc/nginx/servers/http' -upstream_http_dir = '/etc/nginx/upstreams/http' -server_stream_dir = '/etc/nginx/servers/stream' -upstream_stream_dir = '/etc/nginx/upstreams/stream' - -# Time (in seconds) to wait to get status after committing a staged config -staged_config_publish_waittime = 2 - -# Time (in seconds) to wait between two subsequent asynchronous submissions publish requests through PATCH -asynchronous_publish_waittime = 30 - -# NGINX App Protect support -nap_policies_dir = '/etc/nginx/waf/policies' -nap_logformats_dir = '/etc/nginx/waf/logformats' -nap_logformats_template = "logformat.tmpl" -nap_policies_dir_pum = '/etc/nms' -nap_logformats_dir_pum = '/etc/nms' - -# Staged configuration filenames -staged_config_http_filename = 'conf.d/services.conf' -staged_config_stream_filename = 'stream-conf.d/services.conf' diff --git a/etc/config.yaml b/etc/config.yaml new file mode 100644 index 00000000..afeee90f --- /dev/null +++ b/etc/config.yaml @@ -0,0 +1,92 @@ +# +# NGINX Declarative API - https://github.com/f5devcentral/NGINX-Declarative-API/ +# Main configuration file +# + +# Main variables +main: + banner: "NGINX Declarative API" + version: "5.6.0" + url: "https://github.com/f5devcentral/NGINX-Declarative-API" + +# Templates +templates: + root_dir: "../templates" + nginxmain: "nginx-conf/nginx.conf" + mimetypes: "nginx-conf/mime.types" + license: "nginx-conf/license-key.tmpl" + + httpconf: "http.tmpl" + apigwconf: "apigateway.tmpl" + apigwmapsconf: "apigateway-maps.tmpl" + visibility_root: "visibility" + streamconf: "stream.tmpl" + configmap: "configmap.tmpl" + resolver: "misc/resolver.tmpl" + + server_http: "misc/server-http.tmpl" + server_stream: "misc/server-stream.tmpl" + + upstream_http: "misc/upstream-http.tmpl" + upstream_stream: "misc/upstream-stream.tmpl" + + auth_client_root: "authn/client" + auth_server_root: "authn/server" + authz_client_root: "authz/client" + + acme_issuer: "misc/acme.tmpl" + + devportal_root: "devportal" + misc_root: "misc" + +# NGINX Declarative API Server +apiserver: + host: "0.0.0.0" + port: 5000 + +# Redis backend +redis: + host: "redis" + port: 6379 + +# Redocly devportal helper +devportal: + host: "devportal" + port: 5000 + uri: "/v1/devportal" + +# Staged configuration directories +nms: + config_dir: "/etc/nginx" + certs_dir: "/etc/nginx/ssl" + acme_dir: "/etc/nginx/acme" + apigw_dir: "/etc/nginx/apigateway" + apigw_maps_dir: "/etc/nginx/apigateway/maps" + visibility_dir: "/etc/nginx/visibility" + devportal_dir: "/etc/nginx/devportal" + auth_client_dir: "/etc/nginx/authn/client" + auth_server_dir: "/etc/nginx/authn/server" + authz_client_dir: "/etc/nginx/authz/client" + njs_dir: "/etc/nginx/njs" + resolver_dir: "/etc/nginx/resolvers" + server_http_dir: "/etc/nginx/servers/http" + upstream_http_dir: "/etc/nginx/upstreams/http" + server_stream_dir: "/etc/nginx/servers/stream" + upstream_stream_dir: "/etc/nginx/upstreams/stream" + + # Time (in seconds) to wait to get status after committing a staged config + staged_config_publish_waittime: 2 + + # Time (in seconds) to wait between two subsequent asynchronous submissions publish requests through PATCH + asynchronous_publish_waittime: 30 + + # NGINX App Protect support + nap_policies_dir: "/etc/nginx/waf/policies" + nap_logformats_dir: "/etc/nginx/waf/logformats" + nap_logformats_template: "logformat.tmpl" + nap_policies_dir_pum: "/etc/nms" + nap_logformats_dir_pum: "/etc/nms" + + # Staged configuration filenames + staged_config_http_filename: "conf.d/services.conf" + staged_config_stream_filename: "stream-conf.d/services.conf" \ No newline at end of file diff --git a/openapi.json b/openapi.json deleted file mode 100644 index 1dc5a9ef..00000000 --- a/openapi.json +++ /dev/null @@ -1,6686 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "NGINX Declarative API", - "contact": { - "name": "GitHub", - "url": "https://github.com/f5devcentral/NGINX-Declarative-API" - }, - "version": "5.5.0" - }, - "paths": { - "/v5.4/config": { - "post": { - "summary": "Post Config V5 4", - "operationId": "post_config_v5_4_v5_4_config_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__ConfigDeclaration" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v5.5/config": { - "post": { - "summary": "Post Config V5 5", - "operationId": "post_config_v5_5_v5_5_config_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConfigDeclaration" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v5.4/config/{configuid}": { - "patch": { - "summary": "Patch Config V5 4", - "operationId": "patch_config_v5_4_v5_4_config__configuid__patch", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__ConfigDeclaration" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "get": { - "summary": "Get Config Declaration V5 4", - "operationId": "get_config_declaration_v5_4_v5_4_config__configuid__get", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "delete": { - "summary": "Delete Config", - "operationId": "delete_config_v5_4_config__configuid__delete", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v5.5/config/{configuid}": { - "patch": { - "summary": "Patch Config V5 5", - "operationId": "patch_config_v5_5_v5_5_config__configuid__patch", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConfigDeclaration" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "get": { - "summary": "Get Config Declaration V5 5", - "operationId": "get_config_declaration_v5_5_v5_5_config__configuid__get", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "delete": { - "summary": "Delete Config", - "operationId": "delete_config_v5_5_config__configuid__delete", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v5.5/config/{configuid}/status": { - "get": { - "summary": "Get Config Status", - "operationId": "get_config_status_v5_5_config__configuid__status_get", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v5.4/config/{configuid}/status": { - "get": { - "summary": "Get Config Status", - "operationId": "get_config_status_v5_4_config__configuid__status_get", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v5.4/config/{configuid}/submission/{submissionuid}": { - "get": { - "summary": "Get Submission Status", - "operationId": "get_submission_status_v5_4_config__configuid__submission__submissionuid__get", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - }, - { - "name": "submissionuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Submissionuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v5.5/config/{configuid}/submission/{submissionuid}": { - "get": { - "summary": "Get Submission Status", - "operationId": "get_submission_status_v5_5_config__configuid__submission__submissionuid__get", - "parameters": [ - { - "name": "configuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Configuid" - } - }, - { - "name": "submissionuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Submissionuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "APIGatewayAuthentication": { - "properties": { - "client": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LocationAuthClient" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Client", - "default": [] - }, - "enforceOnPaths": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enforceonpaths", - "default": true - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Paths", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "APIGatewayAuthentication" - }, - "APIGatewayAuthorization": { - "properties": { - "profile": { - "type": "string", - "title": "Profile" - }, - "enforceOnPaths": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enforceonpaths", - "default": true - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Paths", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "profile" - ], - "title": "APIGatewayAuthorization" - }, - "APIGatewayCache": { - "properties": { - "profile": { - "type": "string", - "title": "Profile" - }, - "key": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Key", - "default": "$scheme$proxy_host$request_uri" - }, - "validity": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/CacheObjectTTL" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Validity", - "default": [] - }, - "enforceOnPaths": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enforceonpaths", - "default": true - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Paths", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "profile" - ], - "title": "APIGatewayCache" - }, - "API_Gateway": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": false - }, - "strip_uri": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Strip Uri", - "default": false - }, - "server_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Server Url", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "API_Gateway" - }, - "AcmeIssuers": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "default": "" - }, - "uri": { - "type": "string", - "title": "Uri", - "default": "" - }, - "account_key": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Account Key", - "default": "" - }, - "contact": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Contact", - "default": "" - }, - "ssl_trusted_certificate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ssl Trusted Certificate", - "default": "" - }, - "ssl_verify": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Ssl Verify", - "default": false - }, - "state_path": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "State Path", - "default": "" - }, - "accept_terms_of_service": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Accept Terms Of Service", - "default": false - } - }, - "additionalProperties": false, - "type": "object", - "title": "AcmeIssuers" - }, - "AppProtect": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": false - }, - "policy": { - "type": "string", - "title": "Policy", - "default": "" - }, - "log": { - "$ref": "#/components/schemas/AppProtectLog", - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "AppProtect" - }, - "AppProtectLog": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": false - }, - "profile_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Profile Name", - "default": "" - }, - "destination": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Destination", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "AppProtectLog" - }, - "AppProtectLogProfile": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "format": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Format", - "default": "default" - }, - "format_string": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Format String", - "default": "" - }, - "type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Type", - "default": "blocked" - }, - "max_request_size": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Max Request Size", - "default": "any" - }, - "max_message_size": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Max Message Size", - "default": "5k" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "AppProtectLogProfile" - }, - "AuthClientJWT": { - "properties": { - "realm": { - "type": "string", - "title": "Realm", - "default": "JWT Authentication" - }, - "key": { - "type": "string", - "title": "Key", - "default": "" - }, - "cachetime": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Cachetime", - "default": 0 - }, - "jwt_type": { - "type": "string", - "title": "Jwt Type", - "default": "signed" - }, - "token_location": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Token Location", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "AuthClientJWT" - }, - "AuthClientMtls": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": "off" - }, - "client_certificates": { - "type": "string", - "title": "Client Certificates", - "default": "" - }, - "trusted_ca_certificates": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Trusted Ca Certificates", - "default": "" - }, - "ocsp": { - "anyOf": [ - { - "$ref": "#/components/schemas/Ocsp" - }, - { - "type": "null" - } - ], - "default": {} - }, - "stapling": { - "anyOf": [ - { - "$ref": "#/components/schemas/OcspStapling" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "AuthClientMtls" - }, - "AuthClientOIDC": { - "properties": { - "issuer": { - "type": "string", - "title": "Issuer", - "default": "" - }, - "client_id": { - "type": "string", - "title": "Client Id", - "default": "" - }, - "client_secret": { - "type": "string", - "title": "Client Secret", - "default": "" - }, - "config_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Config Url", - "default": "" - }, - "cookie_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Cookie Name", - "default": "" - }, - "extra_auth_args": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Extra Auth Args", - "default": "" - }, - "redirect_uri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Redirect Uri", - "default": "/oidc_callback" - }, - "logout_uri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Logout Uri", - "default": "" - }, - "post_logout_uri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Post Logout Uri", - "default": "" - }, - "logout_token_hint": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Logout Token Hint", - "default": false - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Scope", - "default": "openid" - }, - "session_store": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Session Store", - "default": "" - }, - "session_timeout": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Session Timeout", - "default": "8h" - }, - "ssl_crl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ssl Crl", - "default": "" - }, - "ssl_trusted_certificate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ssl Trusted Certificate", - "default": "" - }, - "userinfo": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Userinfo", - "default": false - } - }, - "additionalProperties": false, - "type": "object", - "title": "AuthClientOIDC" - }, - "AuthServerMtls": { - "properties": { - "certificate": { - "type": "string", - "title": "Certificate", - "default": "" - }, - "key": { - "type": "string", - "title": "Key", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "AuthServerMtls" - }, - "AuthServerToken": { - "properties": { - "token": { - "type": "string", - "title": "Token", - "default": "" - }, - "type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Type", - "default": "" - }, - "location": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Location", - "default": "" - }, - "username": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Username", - "default": "" - }, - "password": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Password", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "AuthServerToken" - }, - "Authentication": { - "properties": { - "client": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Authentication_Client" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Client", - "default": [] - }, - "server": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Authentication_Server" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Server", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "Authentication" - }, - "Authentication_Client": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "type": { - "type": "string", - "title": "Type" - }, - "jwt": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthClientJWT" - }, - { - "type": "null" - } - ], - "default": {} - }, - "mtls": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthClientMtls" - }, - { - "type": "null" - } - ], - "default": {} - }, - "oidc": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthClientOIDC" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "type" - ], - "title": "Authentication_Client" - }, - "Authentication_Server": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "type": { - "type": "string", - "title": "Type" - }, - "token": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthServerToken" - }, - { - "type": "null" - } - ], - "default": {} - }, - "mtls": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthServerMtls" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "type" - ], - "title": "Authentication_Server" - }, - "Authorization": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "type": { - "type": "string", - "title": "Type" - }, - "jwt": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthorizationJWT" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "type" - ], - "title": "Authorization" - }, - "AuthorizationJWT": { - "properties": { - "claims": { - "items": { - "$ref": "#/components/schemas/JwtAuthZNameValue" - }, - "type": "array", - "title": "Claims" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "claims" - ], - "title": "AuthorizationJWT" - }, - "AuthorizationProfileReference": { - "properties": { - "profile": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Profile", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "AuthorizationProfileReference" - }, - "CacheItem": { - "properties": { - "profile": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Profile", - "default": "" - }, - "key": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Key", - "default": "$scheme$proxy_host$request_uri" - }, - "validity": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/CacheObjectTTL" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Validity", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "CacheItem" - }, - "CacheObjectTTL": { - "properties": { - "code": { - "type": "string", - "title": "Code", - "default": "any" - }, - "ttl": { - "type": "string", - "title": "Ttl", - "default": "10m" - } - }, - "additionalProperties": false, - "type": "object", - "title": "CacheObjectTTL" - }, - "CacheProfile": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "basepath": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Basepath", - "default": "/tmp" - }, - "size": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Size", - "default": "10m" - }, - "ttl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ttl", - "default": "10m" - }, - "max_size": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Max Size", - "default": "" - }, - "min_free": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Min Free", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "CacheProfile" - }, - "CachingItem": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "key": { - "type": "string", - "title": "Key" - }, - "size": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Size", - "default": "10m" - }, - "valid": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/ValidItem" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Valid", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "key" - ], - "title": "CachingItem" - }, - "ConfigDeclaration": { - "properties": { - "output": { - "$ref": "#/components/schemas/Output" - }, - "declaration": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__Declaration" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "output" - ], - "title": "ConfigDeclaration" - }, - "Declaration": { - "properties": { - "layer4": { - "anyOf": [ - { - "$ref": "#/components/schemas/Layer4" - }, - { - "type": "null" - } - ], - "default": {} - }, - "http": { - "anyOf": [ - { - "$ref": "#/components/schemas/Http" - }, - { - "type": "null" - } - ], - "default": {} - }, - "resolvers": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Resolver" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Resolvers", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "Declaration" - }, - "DevPortal_Backstage": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "default": "" - }, - "lifecycle": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Lifecycle", - "default": "production" - }, - "owner": { - "type": "string", - "title": "Owner", - "default": "" - }, - "system": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "System", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "DevPortal_Backstage" - }, - "DevPortal_Redocly": { - "properties": { - "uri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Uri", - "default": "/devportal.html" - } - }, - "additionalProperties": false, - "type": "object", - "title": "DevPortal_Redocly" - }, - "DeveloperPortal": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": false - }, - "type": { - "type": "string", - "title": "Type", - "default": "" - }, - "redocly": { - "anyOf": [ - { - "$ref": "#/components/schemas/DevPortal_Redocly" - }, - { - "type": "null" - } - ], - "default": {} - }, - "backstage": { - "anyOf": [ - { - "$ref": "#/components/schemas/DevPortal_Backstage" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "DeveloperPortal" - }, - "HTTPHeader": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "default": "" - }, - "value": { - "type": "string", - "title": "Value", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "HTTPHeader" - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "HealthCheck": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": false - }, - "uri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Uri", - "default": "/" - }, - "interval": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Interval", - "default": 5 - }, - "fails": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Fails", - "default": 1 - }, - "passes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Passes", - "default": 1 - } - }, - "additionalProperties": false, - "type": "object", - "title": "HealthCheck" - }, - "Http": { - "properties": { - "servers": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__Server" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Servers", - "default": [] - }, - "upstreams": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__Upstream" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Upstreams", - "default": [] - }, - "caching": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/CachingItem" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Caching", - "default": [] - }, - "rate_limit": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/RateLimitItem" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Rate Limit", - "default": [] - }, - "nginx_plus_api": { - "anyOf": [ - { - "$ref": "#/components/schemas/NginxPlusApi" - }, - { - "type": "null" - } - ], - "default": {} - }, - "maps": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Map" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Maps", - "default": [] - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__Authentication" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authorization": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__Authorization" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Authorization", - "default": [] - }, - "njs": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__NjsHookHttpServer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Njs", - "default": [] - }, - "njs_profiles": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__NjsFile" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Njs Profiles", - "default": [] - }, - "cache": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/CacheProfile" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Cache", - "default": [] - }, - "logformats": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LogFormat" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Logformats", - "default": [] - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "acme_issuers": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/AcmeIssuers" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Acme Issuers", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "Http" - }, - "JwtAuthZNameValue": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "value": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Value" - }, - "errorcode": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Errorcode", - "default": 401 - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "value" - ], - "title": "JwtAuthZNameValue" - }, - "L4Origin": { - "properties": { - "server": { - "type": "string", - "title": "Server" - }, - "weight": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Weight", - "default": 1 - }, - "max_fails": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Max Fails", - "default": 1 - }, - "fail_timeout": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Fail Timeout", - "default": "10s" - }, - "max_conns": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Max Conns", - "default": 0 - }, - "slow_start": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Slow Start", - "default": "0" - }, - "backup": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Backup", - "default": false - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "server" - ], - "title": "L4Origin" - }, - "L4Server": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "listen": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__ListenL4" - }, - { - "type": "null" - } - ], - "default": {} - }, - "upstream": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Upstream", - "default": "" - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "L4Server" - }, - "L4Tls": { - "properties": { - "certificate": { - "type": "string", - "title": "Certificate", - "default": "" - }, - "key": { - "type": "string", - "title": "Key", - "default": "" - }, - "ciphers": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ciphers", - "default": "" - }, - "protocols": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Protocols", - "default": [] - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationAuth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "L4Tls" - }, - "L4Upstream": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "origin": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/L4Origin" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Origin", - "default": [] - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "L4Upstream" - }, - "Layer4": { - "properties": { - "servers": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/L4Server" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Servers", - "default": [] - }, - "upstreams": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__L4Upstream" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Upstreams", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "Layer4" - }, - "License": { - "properties": { - "endpoint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Endpoint", - "default": "product.connect.nginx.com" - }, - "token": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Token", - "default": "" - }, - "ssl_verify": { - "type": "boolean", - "title": "Ssl Verify", - "default": true - }, - "grace_period": { - "type": "boolean", - "title": "Grace Period", - "default": false - } - }, - "additionalProperties": false, - "type": "object", - "title": "License" - }, - "Listen": { - "properties": { - "address": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Address", - "default": "" - }, - "http2": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Http2", - "default": false - }, - "tls": { - "anyOf": [ - { - "$ref": "#/components/schemas/Tls" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "Listen" - }, - "ListenL4": { - "properties": { - "address": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Address", - "default": "" - }, - "protocol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Protocol", - "default": "tcp" - }, - "tls": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__L4Tls" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "ListenL4" - }, - "Location": { - "properties": { - "uri": { - "type": "string", - "title": "Uri" - }, - "urimatch": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Urimatch", - "default": "prefix" - }, - "upstream": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Upstream", - "default": "" - }, - "log": { - "anyOf": [ - { - "$ref": "#/components/schemas/Log" - }, - { - "type": "null" - } - ], - "default": {} - }, - "apigateway": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__APIGateway" - }, - { - "type": "null" - } - ], - "default": {} - }, - "caching": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Caching", - "default": "" - }, - "rate_limit": { - "anyOf": [ - { - "$ref": "#/components/schemas/RateLimit" - }, - { - "type": "null" - } - ], - "default": {} - }, - "health_check": { - "anyOf": [ - { - "$ref": "#/components/schemas/HealthCheck" - }, - { - "type": "null" - } - ], - "default": {} - }, - "app_protect": { - "anyOf": [ - { - "$ref": "#/components/schemas/AppProtect" - }, - { - "type": "null" - } - ], - "default": {} - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationAuth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authorization": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthorizationProfileReference" - }, - { - "type": "null" - } - ], - "default": {} - }, - "headers": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationHeaders" - }, - { - "type": "null" - } - ], - "default": {} - }, - "njs": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__NjsHookLocation" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Njs", - "default": [] - }, - "cache": { - "anyOf": [ - { - "$ref": "#/components/schemas/CacheItem" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "uri" - ], - "title": "Location" - }, - "LocationAuth": { - "properties": { - "client": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LocationAuthClient" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Client", - "default": [] - }, - "server": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LocationAuthServer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Server", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "LocationAuth" - }, - "LocationAuthClient": { - "properties": { - "profile": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Profile", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "LocationAuthClient" - }, - "LocationAuthServer": { - "properties": { - "profile": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Profile", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "LocationAuthServer" - }, - "LocationHeaderToClient": { - "properties": { - "add": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/HTTPHeader" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Add", - "default": [] - }, - "delete": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Delete", - "default": [] - }, - "replace": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/HTTPHeader" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Replace", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "LocationHeaderToClient" - }, - "LocationHeaderToServer": { - "properties": { - "set": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/HTTPHeader" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Set", - "default": [] - }, - "delete": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Delete", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "LocationHeaderToServer" - }, - "LocationHeaders": { - "properties": { - "to_server": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationHeaderToServer" - }, - { - "type": "null" - } - ], - "default": {} - }, - "to_client": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationHeaderToClient" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "LocationHeaders" - }, - "Log": { - "properties": { - "access": { - "anyOf": [ - { - "$ref": "#/components/schemas/LogAccess" - }, - { - "type": "null" - } - ], - "default": {} - }, - "error": { - "anyOf": [ - { - "$ref": "#/components/schemas/LogError" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "Log" - }, - "LogAccess": { - "properties": { - "destination": { - "type": "string", - "title": "Destination" - }, - "format": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Format", - "default": "combined" - }, - "condition": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Condition", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "destination" - ], - "title": "LogAccess" - }, - "LogError": { - "properties": { - "destination": { - "type": "string", - "title": "Destination" - }, - "level": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Level", - "default": "info" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "destination" - ], - "title": "LogError" - }, - "LogFormat": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "escape": { - "type": "string", - "title": "Escape", - "default": "default" - }, - "format": { - "type": "string", - "title": "Format" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "format" - ], - "title": "LogFormat" - }, - "LogProfile": { - "properties": { - "type": { - "type": "string", - "title": "Type" - }, - "app_protect": { - "anyOf": [ - { - "$ref": "#/components/schemas/AppProtectLogProfile" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type" - ], - "title": "LogProfile" - }, - "Map": { - "properties": { - "match": { - "type": "string", - "title": "Match" - }, - "variable": { - "type": "string", - "title": "Variable" - }, - "entries": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/MapEntry" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Entries", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "match", - "variable" - ], - "title": "Map" - }, - "MapEntry": { - "properties": { - "key": { - "type": "string", - "title": "Key" - }, - "keymatch": { - "type": "string", - "title": "Keymatch" - }, - "value": { - "type": "string", - "title": "Value" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "key", - "keymatch", - "value" - ], - "title": "MapEntry" - }, - "NGINXPolicy": { - "properties": { - "type": { - "type": "string", - "title": "Type", - "default": "" - }, - "name": { - "type": "string", - "title": "Name", - "default": "" - }, - "active_tag": { - "type": "string", - "title": "Active Tag", - "default": "" - }, - "versions": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NGINXPolicyVersion" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Versions", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "NGINXPolicy" - }, - "NGINXPolicyVersion": { - "properties": { - "tag": { - "type": "string", - "title": "Tag", - "default": "" - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "default": "" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "default": "" - }, - "contents": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "NGINXPolicyVersion" - }, - "NginxPlusApi": { - "properties": { - "write": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Write", - "default": false - }, - "listen": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Listen", - "default": "" - }, - "allow_acl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Allow Acl", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "NginxPlusApi" - }, - "NjsFile": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "file": { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "file" - ], - "title": "NjsFile" - }, - "NjsHookHttpServer": { - "properties": { - "hook": { - "$ref": "#/components/schemas/NjsHookHttpServerDetails" - }, - "profile": { - "type": "string", - "title": "Profile" - }, - "function": { - "type": "string", - "title": "Function" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "hook", - "profile", - "function" - ], - "title": "NjsHookHttpServer" - }, - "NjsHookHttpServerDetails": { - "properties": { - "type": { - "type": "string", - "title": "Type" - }, - "js_preload_object": { - "anyOf": [ - { - "$ref": "#/components/schemas/NjsHook_js_preload_object" - }, - { - "type": "null" - } - ], - "default": {} - }, - "js_set": { - "anyOf": [ - { - "$ref": "#/components/schemas/NjsHook_js_set" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type" - ], - "title": "NjsHookHttpServerDetails" - }, - "NjsHookLocationDetails": { - "properties": { - "type": { - "type": "string", - "title": "Type" - }, - "js_preload_object": { - "anyOf": [ - { - "$ref": "#/components/schemas/NjsHook_js_preload_object" - }, - { - "type": "null" - } - ], - "default": {} - }, - "js_set": { - "anyOf": [ - { - "$ref": "#/components/schemas/NjsHook_js_set" - }, - { - "type": "null" - } - ], - "default": {} - }, - "js_body_filter": { - "anyOf": [ - { - "$ref": "#/components/schemas/NjsHook_js_body_filter" - }, - { - "type": "null" - } - ], - "default": {} - }, - "js_periodic": { - "anyOf": [ - { - "$ref": "#/components/schemas/NjsHook_js_periodic" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type" - ], - "title": "NjsHookLocationDetails" - }, - "NjsHook_js_body_filter": { - "properties": { - "buffer_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Buffer Type", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "NjsHook_js_body_filter" - }, - "NjsHook_js_periodic": { - "properties": { - "interval": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Interval", - "default": "" - }, - "jitter": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Jitter", - "default": 0 - }, - "worker_affinity": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Worker Affinity", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "NjsHook_js_periodic" - }, - "NjsHook_js_preload_object": { - "properties": { - "file": { - "type": "string", - "title": "File" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "file" - ], - "title": "NjsHook_js_preload_object" - }, - "NjsHook_js_set": { - "properties": { - "variable": { - "type": "string", - "title": "Variable" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "variable" - ], - "title": "NjsHook_js_set" - }, - "NmsCertificate": { - "properties": { - "type": { - "type": "string", - "title": "Type" - }, - "name": { - "type": "string", - "title": "Name" - }, - "contents": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type", - "name" - ], - "title": "NmsCertificate" - }, - "ObjectFromSourceOfTruth": { - "properties": { - "content": { - "type": "string", - "title": "Content", - "default": "" - }, - "authentication": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LocationAuthServer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Authentication", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "ObjectFromSourceOfTruth" - }, - "Ocsp": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": "off" - }, - "responder": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Responder", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "Ocsp" - }, - "OcspStapling": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": false - }, - "verify": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Verify", - "default": false - }, - "responder": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Responder", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "OcspStapling" - }, - "Origin": { - "properties": { - "server": { - "type": "string", - "title": "Server" - }, - "weight": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Weight", - "default": 1 - }, - "max_fails": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Max Fails", - "default": 1 - }, - "fail_timeout": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Fail Timeout", - "default": "10s" - }, - "max_conns": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Max Conns", - "default": 0 - }, - "slow_start": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Slow Start", - "default": "0" - }, - "backup": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Backup", - "default": false - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "server" - ], - "title": "Origin" - }, - "Output": { - "properties": { - "type": { - "type": "string", - "title": "Type" - }, - "synchronous": { - "type": "boolean", - "title": "Synchronous", - "default": true - }, - "license": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__License" - }, - { - "type": "null" - } - ], - "default": {} - }, - "nms": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__OutputNMS" - }, - { - "type": "null" - } - ], - "default": {} - }, - "nginxone": { - "anyOf": [ - { - "$ref": "#/components/schemas/OutputNGINXOne" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type" - ], - "title": "Output" - }, - "OutputNGINXOne": { - "properties": { - "url": { - "type": "string", - "title": "Url", - "default": "" - }, - "namespace": { - "type": "string", - "title": "Namespace", - "default": "" - }, - "token": { - "type": "string", - "title": "Token", - "default": "" - }, - "configsyncgroup": { - "type": "string", - "title": "Configsyncgroup", - "default": "" - }, - "synctime": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Synctime", - "default": 0 - }, - "modules": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Modules", - "default": [] - }, - "certificates": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__NmsCertificate" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Certificates", - "default": [] - }, - "policies": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NGINXPolicy" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Policies", - "default": [] - }, - "log_profiles": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LogProfile" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Log Profiles", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "OutputNGINXOne" - }, - "OutputNMS": { - "properties": { - "url": { - "type": "string", - "title": "Url", - "default": "" - }, - "username": { - "type": "string", - "title": "Username", - "default": "" - }, - "password": { - "type": "string", - "title": "Password", - "default": "" - }, - "instancegroup": { - "type": "string", - "title": "Instancegroup", - "default": "" - }, - "synctime": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Synctime", - "default": 0 - }, - "modules": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Modules", - "default": [] - }, - "certificates": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NmsCertificate" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Certificates", - "default": [] - }, - "policies": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__NGINXPolicy" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Policies", - "default": [] - }, - "log_profiles": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LogProfile" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Log Profiles", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "OutputNMS" - }, - "RateLimit": { - "properties": { - "profile": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Profile", - "default": "" - }, - "httpcode": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Httpcode", - "default": 429 - }, - "burst": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Burst", - "default": 0 - }, - "delay": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Delay", - "default": 0 - } - }, - "additionalProperties": false, - "type": "object", - "title": "RateLimit" - }, - "RateLimitApiGw": { - "properties": { - "profile": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Profile", - "default": "" - }, - "httpcode": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Httpcode", - "default": 429 - }, - "burst": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Burst", - "default": 0 - }, - "delay": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Delay", - "default": 0 - }, - "enforceOnPaths": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enforceonpaths", - "default": true - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Paths", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "RateLimitApiGw" - }, - "RateLimitItem": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "key": { - "type": "string", - "title": "Key" - }, - "size": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Size", - "default": "" - }, - "rate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Rate", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "key" - ], - "title": "RateLimitItem" - }, - "Resolver": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "address": { - "type": "string", - "title": "Address" - }, - "valid": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Valid", - "default": "" - }, - "ipv4": { - "type": "boolean", - "title": "Ipv4", - "default": true - }, - "ipv6": { - "type": "boolean", - "title": "Ipv6", - "default": true - }, - "timeout": { - "type": "string", - "title": "Timeout", - "default": "30s" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "address" - ], - "title": "Resolver" - }, - "Server": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "names": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Names", - "default": [] - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "listen": { - "anyOf": [ - { - "$ref": "#/components/schemas/Listen" - }, - { - "type": "null" - } - ], - "default": {} - }, - "log": { - "anyOf": [ - { - "$ref": "#/components/schemas/Log" - }, - { - "type": "null" - } - ], - "default": {} - }, - "locations": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__Location" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Locations", - "default": [] - }, - "app_protect": { - "anyOf": [ - { - "$ref": "#/components/schemas/AppProtect" - }, - { - "type": "null" - } - ], - "default": {} - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "headers": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__LocationHeaders" - }, - { - "type": "null" - } - ], - "default": {} - }, - "njs": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NjsHookHttpServer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Njs", - "default": [] - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationAuth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authorization": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthorizationProfileReference" - }, - { - "type": "null" - } - ], - "default": {} - }, - "cache": { - "anyOf": [ - { - "$ref": "#/components/schemas/CacheItem" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "Server" - }, - "Sticky": { - "properties": { - "cookie": { - "type": "string", - "title": "Cookie", - "default": "" - }, - "expires": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Expires", - "default": "" - }, - "domain": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Domain", - "default": "" - }, - "path": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Path", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "Sticky" - }, - "Tls": { - "properties": { - "certificate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Certificate", - "default": "" - }, - "key": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Key", - "default": "" - }, - "acme_issuer": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Acme Issuer", - "default": "" - }, - "ciphers": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ciphers", - "default": "" - }, - "protocols": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Protocols", - "default": [] - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationAuth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "Tls" - }, - "Upstream": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "origin": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Origin" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Origin", - "default": [] - }, - "sticky": { - "anyOf": [ - { - "$ref": "#/components/schemas/Sticky" - }, - { - "type": "null" - } - ], - "default": {} - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "Upstream" - }, - "V5_4_NginxConfigDeclaration__APIGateway": { - "properties": { - "openapi_schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "api_gateway": { - "anyOf": [ - { - "$ref": "#/components/schemas/API_Gateway" - }, - { - "type": "null" - } - ], - "default": {} - }, - "developer_portal": { - "anyOf": [ - { - "$ref": "#/components/schemas/DeveloperPortal" - }, - { - "type": "null" - } - ], - "default": {} - }, - "visibility": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Visibility" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Visibility", - "default": [] - }, - "rate_limit": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/RateLimitApiGw" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Rate Limit", - "default": [] - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/APIGatewayAuthentication" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authorization": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/APIGatewayAuthorization" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Authorization", - "default": [] - }, - "cache": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/APIGatewayCache" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Cache", - "default": [] - }, - "log": { - "anyOf": [ - { - "$ref": "#/components/schemas/Log" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "APIGateway" - }, - "V5_4_NginxConfigDeclaration__Authentication": { - "properties": { - "client": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__Authentication_Client" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Client", - "default": [] - }, - "server": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Authentication_Server" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Server", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "Authentication" - }, - "V5_4_NginxConfigDeclaration__Authentication_Client": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "type": { - "type": "string", - "title": "Type" - }, - "jwt": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthClientJWT" - }, - { - "type": "null" - } - ], - "default": {} - }, - "mtls": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthClientMtls" - }, - { - "type": "null" - } - ], - "default": {} - }, - "oidc": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthClientOIDC" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "type" - ], - "title": "Authentication_Client" - }, - "V5_4_NginxConfigDeclaration__Authorization": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "type": { - "type": "string", - "title": "Type" - }, - "jwt": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthorizationJWT" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "type" - ], - "title": "Authorization" - }, - "V5_4_NginxConfigDeclaration__ConfigDeclaration": { - "properties": { - "output": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__Output" - }, - "declaration": { - "anyOf": [ - { - "$ref": "#/components/schemas/Declaration" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "output" - ], - "title": "ConfigDeclaration" - }, - "V5_4_NginxConfigDeclaration__L4Upstream": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "origin": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/L4Origin" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Origin", - "default": [] - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "L4Upstream" - }, - "V5_4_NginxConfigDeclaration__Listen": { - "properties": { - "address": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Address", - "default": "" - }, - "http2": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Http2", - "default": false - }, - "tls": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__Tls" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "Listen" - }, - "V5_4_NginxConfigDeclaration__ListenL4": { - "properties": { - "address": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Address", - "default": "" - }, - "protocol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Protocol", - "default": "tcp" - }, - "tls": { - "anyOf": [ - { - "$ref": "#/components/schemas/L4Tls" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "ListenL4" - }, - "V5_4_NginxConfigDeclaration__NGINXPolicy": { - "properties": { - "type": { - "type": "string", - "title": "Type", - "default": "" - }, - "name": { - "type": "string", - "title": "Name", - "default": "" - }, - "active_tag": { - "type": "string", - "title": "Active Tag", - "default": "" - }, - "versions": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__NGINXPolicyVersion" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Versions", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "NGINXPolicy" - }, - "V5_4_NginxConfigDeclaration__NGINXPolicyVersion": { - "properties": { - "tag": { - "type": "string", - "title": "Tag", - "default": "" - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Displayname", - "default": "" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "default": "" - }, - "contents": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "NGINXPolicyVersion" - }, - "V5_4_NginxConfigDeclaration__NjsFile": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "file": { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "file" - ], - "title": "NjsFile" - }, - "V5_4_NginxConfigDeclaration__NjsHookHttpServer": { - "properties": { - "hook": { - "$ref": "#/components/schemas/NjsHookHttpServerDetails" - }, - "profile": { - "type": "string", - "title": "Profile" - }, - "function": { - "type": "string", - "title": "Function" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "hook", - "profile", - "function" - ], - "title": "NjsHookHttpServer" - }, - "V5_4_NginxConfigDeclaration__NjsHookLocation": { - "properties": { - "hook": { - "$ref": "#/components/schemas/NjsHookLocationDetails" - }, - "profile": { - "type": "string", - "title": "Profile" - }, - "function": { - "type": "string", - "title": "Function" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "hook", - "profile", - "function" - ], - "title": "NjsHookLocation" - }, - "V5_4_NginxConfigDeclaration__Output": { - "properties": { - "type": { - "type": "string", - "title": "Type" - }, - "synchronous": { - "type": "boolean", - "title": "Synchronous", - "default": true - }, - "license": { - "anyOf": [ - { - "$ref": "#/components/schemas/License" - }, - { - "type": "null" - } - ], - "default": {} - }, - "nms": { - "anyOf": [ - { - "$ref": "#/components/schemas/OutputNMS" - }, - { - "type": "null" - } - ], - "default": {} - }, - "nginxone": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__OutputNGINXOne" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type" - ], - "title": "Output" - }, - "V5_4_NginxConfigDeclaration__OutputNGINXOne": { - "properties": { - "url": { - "type": "string", - "title": "Url", - "default": "" - }, - "namespace": { - "type": "string", - "title": "Namespace", - "default": "" - }, - "token": { - "type": "string", - "title": "Token", - "default": "" - }, - "configsyncgroup": { - "type": "string", - "title": "Configsyncgroup", - "default": "" - }, - "synctime": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Synctime", - "default": 0 - }, - "modules": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Modules", - "default": [] - }, - "certificates": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NmsCertificate" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Certificates", - "default": [] - }, - "policies": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__NGINXPolicy" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Policies", - "default": [] - }, - "log_profiles": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LogProfile" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Log Profiles", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "OutputNGINXOne" - }, - "V5_4_NginxConfigDeclaration__Server": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "names": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Names", - "default": [] - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "listen": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__Listen" - }, - { - "type": "null" - } - ], - "default": {} - }, - "log": { - "anyOf": [ - { - "$ref": "#/components/schemas/Log" - }, - { - "type": "null" - } - ], - "default": {} - }, - "locations": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Location" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Locations", - "default": [] - }, - "app_protect": { - "anyOf": [ - { - "$ref": "#/components/schemas/AppProtect" - }, - { - "type": "null" - } - ], - "default": {} - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "headers": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationHeaders" - }, - { - "type": "null" - } - ], - "default": {} - }, - "njs": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_4_NginxConfigDeclaration__NjsHookHttpServer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Njs", - "default": [] - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationAuth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authorization": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthorizationProfileReference" - }, - { - "type": "null" - } - ], - "default": {} - }, - "cache": { - "anyOf": [ - { - "$ref": "#/components/schemas/CacheItem" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "Server" - }, - "V5_4_NginxConfigDeclaration__Tls": { - "properties": { - "certificate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Certificate", - "default": "" - }, - "key": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Key", - "default": "" - }, - "acme_issuer": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Acme Issuer", - "default": "" - }, - "ciphers": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ciphers", - "default": "" - }, - "protocols": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Protocols", - "default": [] - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationAuth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "Tls" - }, - "V5_4_NginxConfigDeclaration__Upstream": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "origin": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Origin" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Origin", - "default": [] - }, - "sticky": { - "anyOf": [ - { - "$ref": "#/components/schemas/Sticky" - }, - { - "type": "null" - } - ], - "default": {} - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "Upstream" - }, - "V5_5_NginxConfigDeclaration__APIGateway": { - "properties": { - "openapi_schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "api_gateway": { - "anyOf": [ - { - "$ref": "#/components/schemas/API_Gateway" - }, - { - "type": "null" - } - ], - "default": {} - }, - "developer_portal": { - "anyOf": [ - { - "$ref": "#/components/schemas/DeveloperPortal" - }, - { - "type": "null" - } - ], - "default": {} - }, - "visibility": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Visibility" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Visibility", - "default": [] - }, - "rate_limit": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/RateLimitApiGw" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Rate Limit", - "default": [] - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/APIGatewayAuthentication" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authorization": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/APIGatewayAuthorization" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Authorization", - "default": [] - }, - "cache": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/APIGatewayCache" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Cache", - "default": [] - }, - "log": { - "anyOf": [ - { - "$ref": "#/components/schemas/Log" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "APIGateway" - }, - "V5_5_NginxConfigDeclaration__Declaration": { - "properties": { - "layer4": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__Layer4" - }, - { - "type": "null" - } - ], - "default": {} - }, - "http": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__Http" - }, - { - "type": "null" - } - ], - "default": {} - }, - "resolvers": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Resolver" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Resolvers", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "Declaration" - }, - "V5_5_NginxConfigDeclaration__Http": { - "properties": { - "servers": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Server" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Servers", - "default": [] - }, - "upstreams": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Upstream" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Upstreams", - "default": [] - }, - "caching": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/CachingItem" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Caching", - "default": [] - }, - "rate_limit": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/RateLimitItem" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Rate Limit", - "default": [] - }, - "nginx_plus_api": { - "anyOf": [ - { - "$ref": "#/components/schemas/NginxPlusApi" - }, - { - "type": "null" - } - ], - "default": {} - }, - "maps": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Map" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Maps", - "default": [] - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/Authentication" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authorization": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Authorization" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Authorization", - "default": [] - }, - "njs": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NjsHookHttpServer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Njs", - "default": [] - }, - "njs_profiles": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NjsFile" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Njs Profiles", - "default": [] - }, - "cache": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/CacheProfile" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Cache", - "default": [] - }, - "logformats": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LogFormat" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Logformats", - "default": [] - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "acme_issuers": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/AcmeIssuers" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Acme Issuers", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "Http" - }, - "V5_5_NginxConfigDeclaration__L4Server": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "resolver": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Resolver", - "default": "" - }, - "listen": { - "anyOf": [ - { - "$ref": "#/components/schemas/ListenL4" - }, - { - "type": "null" - } - ], - "default": {} - }, - "upstream": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Upstream", - "default": "" - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name" - ], - "title": "L4Server" - }, - "V5_5_NginxConfigDeclaration__L4Tls": { - "properties": { - "certificate": { - "type": "string", - "title": "Certificate", - "default": "" - }, - "key": { - "type": "string", - "title": "Key", - "default": "" - }, - "ciphers": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ciphers", - "default": "" - }, - "protocols": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Protocols", - "default": [] - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationAuth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "L4Tls" - }, - "V5_5_NginxConfigDeclaration__Layer4": { - "properties": { - "servers": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__L4Server" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Servers", - "default": [] - }, - "upstreams": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/L4Upstream" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Upstreams", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "Layer4" - }, - "V5_5_NginxConfigDeclaration__License": { - "properties": { - "endpoint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Endpoint", - "default": "product.connect.nginx.com" - }, - "token": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Token", - "default": "" - }, - "ssl_verify": { - "type": "boolean", - "title": "Ssl Verify", - "default": true - }, - "grace_period": { - "type": "boolean", - "title": "Grace Period", - "default": false - }, - "proxy": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Proxy", - "default": "" - }, - "proxy_username": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Proxy Username", - "default": "" - }, - "proxy_password": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Proxy Password", - "default": "" - } - }, - "additionalProperties": false, - "type": "object", - "title": "License" - }, - "V5_5_NginxConfigDeclaration__Location": { - "properties": { - "uri": { - "type": "string", - "title": "Uri" - }, - "urimatch": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Urimatch", - "default": "prefix" - }, - "upstream": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Upstream", - "default": "" - }, - "log": { - "anyOf": [ - { - "$ref": "#/components/schemas/Log" - }, - { - "type": "null" - } - ], - "default": {} - }, - "apigateway": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__APIGateway" - }, - { - "type": "null" - } - ], - "default": {} - }, - "caching": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Caching", - "default": "" - }, - "rate_limit": { - "anyOf": [ - { - "$ref": "#/components/schemas/RateLimit" - }, - { - "type": "null" - } - ], - "default": {} - }, - "health_check": { - "anyOf": [ - { - "$ref": "#/components/schemas/HealthCheck" - }, - { - "type": "null" - } - ], - "default": {} - }, - "app_protect": { - "anyOf": [ - { - "$ref": "#/components/schemas/AppProtect" - }, - { - "type": "null" - } - ], - "default": {} - }, - "snippet": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationAuth" - }, - { - "type": "null" - } - ], - "default": {} - }, - "authorization": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthorizationProfileReference" - }, - { - "type": "null" - } - ], - "default": {} - }, - "headers": { - "anyOf": [ - { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__LocationHeaders" - }, - { - "type": "null" - } - ], - "default": {} - }, - "njs": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__NjsHookLocation" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Njs", - "default": [] - }, - "cache": { - "anyOf": [ - { - "$ref": "#/components/schemas/CacheItem" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "uri" - ], - "title": "Location" - }, - "V5_5_NginxConfigDeclaration__LocationHeaders": { - "properties": { - "to_server": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationHeaderToServer" - }, - { - "type": "null" - } - ], - "default": {} - }, - "to_client": { - "anyOf": [ - { - "$ref": "#/components/schemas/LocationHeaderToClient" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "LocationHeaders" - }, - "V5_5_NginxConfigDeclaration__NjsHookLocation": { - "properties": { - "hook": { - "$ref": "#/components/schemas/NjsHookLocationDetails" - }, - "profile": { - "type": "string", - "title": "Profile" - }, - "function": { - "type": "string", - "title": "Function" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "hook", - "profile", - "function" - ], - "title": "NjsHookLocation" - }, - "V5_5_NginxConfigDeclaration__NmsCertificate": { - "properties": { - "type": { - "type": "string", - "title": "Type" - }, - "name": { - "type": "string", - "title": "Name" - }, - "contents": { - "anyOf": [ - { - "$ref": "#/components/schemas/ObjectFromSourceOfTruth" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type", - "name" - ], - "title": "NmsCertificate" - }, - "V5_5_NginxConfigDeclaration__OutputNMS": { - "properties": { - "url": { - "type": "string", - "title": "Url", - "default": "" - }, - "username": { - "type": "string", - "title": "Username", - "default": "" - }, - "password": { - "type": "string", - "title": "Password", - "default": "" - }, - "instancegroup": { - "type": "string", - "title": "Instancegroup", - "default": "" - }, - "synctime": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Synctime", - "default": 0 - }, - "modules": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Modules", - "default": [] - }, - "certificates": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/V5_5_NginxConfigDeclaration__NmsCertificate" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Certificates", - "default": [] - }, - "policies": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NGINXPolicy" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Policies", - "default": [] - }, - "log_profiles": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/LogProfile" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Log Profiles", - "default": [] - } - }, - "additionalProperties": false, - "type": "object", - "title": "OutputNMS" - }, - "ValidItem": { - "properties": { - "codes": { - "anyOf": [ - { - "items": { - "type": "integer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Codes", - "default": [ - 200 - ] - }, - "ttl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ttl", - "default": 60 - } - }, - "additionalProperties": false, - "type": "object", - "title": "ValidItem" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "Visibility": { - "properties": { - "enabled": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Enabled", - "default": false - }, - "type": { - "type": "string", - "title": "Type", - "default": "" - }, - "moesif": { - "anyOf": [ - { - "$ref": "#/components/schemas/Visibility_Moesif" - }, - { - "type": "null" - } - ], - "default": {} - } - }, - "additionalProperties": false, - "type": "object", - "title": "Visibility" - }, - "Visibility_Moesif": { - "properties": { - "application_id": { - "type": "string", - "title": "Application Id", - "default": "" - }, - "plugin_path": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Plugin Path", - "default": "/usr/local/share/lua/5.1/resty/moesif" - } - }, - "additionalProperties": false, - "type": "object", - "title": "Visibility_Moesif" - } - } - } -} \ No newline at end of file diff --git a/src/NcgConfig.py b/src/NcgConfig.py index da170ac7..644ae689 100644 --- a/src/NcgConfig.py +++ b/src/NcgConfig.py @@ -2,19 +2,19 @@ Configuration singleton """ -import toml +import yaml class NcgConfig(object): _instance = None config = {} - def __new__(cls,configFile): + def __new__(cls, configFile): if cls._instance is None: - print(f'Reading configuration from {configFile}') + print(f"Reading configuration from {configFile}") cls._instance = super(cls, NcgConfig).__new__(cls) - with open(configFile) as cfgFile: - cls.config = toml.load(cfgFile) + with open(configFile, "r") as cfgFile: + cls.config = yaml.safe_load(cfgFile) - return cls._instance + return cls._instance \ No newline at end of file diff --git a/src/V5_4_CreateConfig.py b/src/V5_6_CreateConfig.py similarity index 89% rename from src/V5_4_CreateConfig.py rename to src/V5_6_CreateConfig.py index 56fbfd60..768588ed 100644 --- a/src/V5_4_CreateConfig.py +++ b/src/V5_6_CreateConfig.py @@ -14,24 +14,24 @@ from pydantic import ValidationError from requests.packages.urllib3.exceptions import InsecureRequestWarning -import v5_4.APIGateway -import v5_4.DevPortal -import v5_4.DeclarationPatcher -import v5_4.GitOps -import v5_4.MiscUtils -import v5_4.NIMOutput -import v5_4.NGINXOneOutput - -# NGINX App Protect helper functions -import v5_4.NIMNAPUtils -import v5_4.NIMUtils +import v5_6.APIGateway +import v5_6.DevPortal +import v5_6.DeclarationPatcher +import v5_6.GitOps +import v5_6.MiscUtils +import v5_6.NIMOutput +import v5_6.NGINXOneOutput + +# F5 WAF for NGINX helper functions +import v5_6.NIMNAPUtils +import v5_6.NIMUtils # NGINX Declarative API modules from NcgConfig import NcgConfig from NcgRedis import NcgRedis # pydantic models -from V5_4_NginxConfigDeclaration import * +from V5_6_NginxConfigDeclaration import * # Tolerates self-signed TLS certificates requests.packages.urllib3.disable_warnings(InsecureRequestWarning) @@ -69,20 +69,20 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn # Pydantic JSON validation ConfigDeclaration(**declaration.model_dump()) except ValidationError as e: - print(f'Invalid declaration {e}') + print(f"Invalid declaration {e}") d = declaration.model_dump() decltype = d['output']['type'] j2_env = Environment(loader=FileSystemLoader(NcgConfig.config['templates']['root_dir'] + '/' + apiversion), trim_blocks=True, extensions=["jinja2_base64_filters.Base64Filters"]) - j2_env.filters['regex_replace'] = v5_4.MiscUtils.regex_replace + j2_env.filters['regex_replace'] = v5_6.MiscUtils.regex_replace # Check resolver profiles validity and creates resolver config files if 'resolvers' in d['declaration']: all_resolver_profiles = [] - d_resolver_profiles = v5_4.MiscUtils.getDictKey(d, 'declaration.resolvers') + d_resolver_profiles = v5_6.MiscUtils.getDictKey(d, 'declaration.resolvers') if d_resolver_profiles is not None: # Render all resolver profiles for i in range(len(d_resolver_profiles)): @@ -101,11 +101,11 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'name': configFileName} all_resolver_profiles.append(resolver_profile['name']) - auxFiles['files'].append(resolverProfileConfigFile) + configFiles['files'].append(resolverProfileConfigFile) if 'http' in d['declaration']: if 'snippet' in d['declaration']['http']: - status, snippet = v5_4.GitOps.getObjectFromRepo(object = d['declaration']['http']['snippet'], authProfiles = d['declaration']['http']['authentication']) + status, snippet = v5_6.GitOps.getObjectFromRepo(object = d['declaration']['http']['snippet'], authProfiles = d['declaration']['http']['authentication']) if status != 200: return {"status_code": 422, "message": {"status_code": status, "message": snippet}} @@ -127,7 +127,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn "content": f"invalid resolver profile [{upstream['resolver']}] in HTTP upstream [{upstream['name']}], must be one of {all_resolver_profiles}"}}} if upstream['snippet']: - status, snippet = v5_4.GitOps.getObjectFromRepo(object = upstream['snippet'], authProfiles = d['declaration']['http']['authentication']) + status, snippet = v5_6.GitOps.getObjectFromRepo(object = upstream['snippet'], authProfiles = d['declaration']['http']['authentication']) if status != 200: return {"status_code": 422, "message": {"status_code": status, "message": snippet}} @@ -145,7 +145,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn upstreamProfileConfigFile = {'contents': b64renderedUpstreamProfile, 'name': configFileName} - auxFiles['files'].append(upstreamProfileConfigFile) + configFiles['files'].append(upstreamProfileConfigFile) all_upstreams.append(http['upstreams'][i]['name']) http = d['declaration']['http'] @@ -153,7 +153,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn # Check HTTP rate_limit profiles validity all_ratelimits = [] - d_rate_limit = v5_4.MiscUtils.getDictKey(d, 'declaration.http.rate_limit') + d_rate_limit = v5_6.MiscUtils.getDictKey(d, 'declaration.http.rate_limit') if d_rate_limit is not None: for i in range(len(d_rate_limit)): all_ratelimits.append(d_rate_limit[i]['name']) @@ -161,7 +161,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn # Check HTTP cache profiles validity all_cache_profiles = [] - d_cache_profiles = v5_4.MiscUtils.getDictKey(d, 'declaration.http.cache') + d_cache_profiles = v5_6.MiscUtils.getDictKey(d, 'declaration.http.cache') if d_cache_profiles is not None: for i in range(len(d_cache_profiles)): all_cache_profiles.append(d_cache_profiles[i]['name']) @@ -172,7 +172,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn all_auth_client_profiles = [] all_auth_server_profiles = [] - d_auth_profiles = v5_4.MiscUtils.getDictKey(d, 'declaration.http.authentication') + d_auth_profiles = v5_6.MiscUtils.getDictKey(d, 'declaration.http.authentication') if d_auth_profiles is not None: if 'client' in d_auth_profiles: # Render all client authentication profiles @@ -194,7 +194,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'name': configFileName } all_auth_client_profiles.append(auth_profile['name']) - auxFiles['files'].append(authProfileConfigFile) + configFiles['files'].append(authProfileConfigFile) # Add the rendered authentication configuration snippet as a config file in the staged configuration - jwks template templateName = NcgConfig.config['templates']['auth_client_root']+"/jwks.tmpl" @@ -206,7 +206,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn authProfileConfigFile = {'contents': b64renderedClientAuthProfile, 'name': configFileName } - auxFiles['files'].append(authProfileConfigFile) + configFiles['files'].append(authProfileConfigFile) case 'mtls': # Add the rendered authentication configuration snippet as a config file in the staged configuration - mTLS template @@ -222,7 +222,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'name': configFileName} all_auth_client_profiles.append(auth_profile['name']) - auxFiles['files'].append(authProfileConfigFile) + configFiles['files'].append(authProfileConfigFile) case 'oidc': # Add the rendered authentication configuration snippet as a config file in the staged configuration - OpenID Connect template @@ -238,7 +238,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'name': configFileName} all_auth_client_profiles.append(auth_profile['name']) - auxFiles['files'].append(authProfileConfigFile) + configFiles['files'].append(authProfileConfigFile) if 'server' in d_auth_profiles: # Render all server authentication profiles @@ -260,7 +260,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'name': configFileName } all_auth_server_profiles.append(auth_profile['name']) - auxFiles['files'].append(authProfileConfigFile) + configFiles['files'].append(authProfileConfigFile) case 'mtls': # Add the rendered authentication configuration snippet as a config file in the staged configuration - mTLS template @@ -276,7 +276,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'name': configFileName} all_auth_server_profiles.append(auth_profile['name']) - auxFiles['files'].append(authProfileConfigFile) + configFiles['files'].append(authProfileConfigFile) # Check authorization profiles validity and creates authorization config files @@ -284,7 +284,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn # List of all authorization client profile names all_authz_client_profiles = [] - d_authz_profiles = v5_4.MiscUtils.getDictKey(d, 'declaration.http.authorization') + d_authz_profiles = v5_6.MiscUtils.getDictKey(d, 'declaration.http.authorization') if d_authz_profiles is not None: # Render all client authorization profiles @@ -304,7 +304,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'name': configFileName } all_authz_client_profiles.append(authz_profile['name']) - auxFiles['files'].append(authProfileConfigFile) + configFiles['files'].append(authProfileConfigFile) # Add the rendered authorization configuration snippet as a config file in the staged configuration - jwt template templateName = NcgConfig.config['templates']['authz_client_root'] + "/jwt.tmpl" @@ -318,17 +318,17 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn authProfileConfigFile = {'contents': b64renderedClientAuthProfile, 'name': configFileName} - auxFiles['files'].append(authProfileConfigFile) + configFiles['files'].append(authProfileConfigFile) # NGINX Javascript profiles all_njs_profiles = [] - d_njs_files = v5_4.MiscUtils.getDictKey(d, 'declaration.http.njs_profiles') + d_njs_files = v5_6.MiscUtils.getDictKey(d, 'declaration.http.njs_profiles') if d_njs_files is not None: for i in range(len(d_njs_files)): njs_file = d_njs_files[i] njs_filename = njs_file['name'].replace(' ','_') - status, content = v5_4.GitOps.getObjectFromRepo(object=njs_file['file'], + status, content = v5_6.GitOps.getObjectFromRepo(object=njs_file['file'], authProfiles=d['declaration']['http'][ 'authentication']) @@ -341,7 +341,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn all_njs_profiles.append(njs_filename) # NGINX ACME issuer profiles - d_acme_issuers = v5_4.MiscUtils.getDictKey(d, 'declaration.http.acme_issuers') + d_acme_issuers = v5_6.MiscUtils.getDictKey(d, 'declaration.http.acme_issuers') all_acme_issuers = [] if d_acme_issuers is not None: # Render all ACME issuer profiles @@ -361,10 +361,10 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'name': configFileName} all_acme_issuers.append(acme_issuer['name']) - auxFiles['files'].append(acmeProfileConfigFile) + configFiles['files'].append(acmeProfileConfigFile) # HTTP level Javascript hooks - d_http_njs_hooks = v5_4.MiscUtils.getDictKey(d, 'declaration.http.njs') + d_http_njs_hooks = v5_6.MiscUtils.getDictKey(d, 'declaration.http.njs') if d_http_njs_hooks is not None: for i in range(len(d_http_njs_hooks)): if d_http_njs_hooks[i]['profile'] not in all_njs_profiles: @@ -374,7 +374,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn "content": f"invalid njs profile [{d_http_njs_hooks[i]['profile']}] in HTTP declaration, must be one of {all_njs_profiles}"}}} # HTTP level resolver validity check - d_http_resolver = v5_4.MiscUtils.getDictKey(d, 'declaration.http.resolver') + d_http_resolver = v5_6.MiscUtils.getDictKey(d, 'declaration.http.resolver') if d_http_resolver: if d_http_resolver not in all_resolver_profiles: return {"status_code": 422, @@ -383,7 +383,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn "content": f"invalid resolver profile [{d_http_resolver}] in HTTP context, must be one of {all_resolver_profiles}"}}} # Parse HTTP servers - d_servers = v5_4.MiscUtils.getDictKey(d, 'declaration.http.servers') + d_servers = v5_6.MiscUtils.getDictKey(d, 'declaration.http.servers') if d_servers is not None: for server in d_servers: serverSnippet = '' @@ -453,7 +453,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn "content": f"invalid ACME issuer [{acmeIssuer}] in server [{server['name']}] must be one of {all_acme_issuers}"}}} if server['snippet']: - status, serverSnippet = v5_4.GitOps.getObjectFromRepo(object = server['snippet'], authProfiles = d['declaration']['http']['authentication'], base64Encode = False) + status, serverSnippet = v5_6.GitOps.getObjectFromRepo(object = server['snippet'], authProfiles = d['declaration']['http']['authentication'], base64Encode = False) if status != 200: return {"status_code": 422, "message": {"status_code": status, "message": serverSnippet}} @@ -465,7 +465,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn httpServerConfb64 = base64.b64encode(bytes(httpServerConf, 'utf-8')).decode('utf-8') newHttpServerAuxFile = {'contents': httpServerConfb64, 'name': NcgConfig.config['nms']['server_http_dir'] + '/' + server['name'].replace(' ', '_') + ".conf"} - auxFiles['files'].append(newHttpServerAuxFile) + configFiles['files'].append(newHttpServerAuxFile) for loc in server['locations']: @@ -479,7 +479,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn "content": f"invalid njs profile [{loc['njs'][i]['profile']}] in location [{loc['uri']}], must be one of {all_njs_profiles}"}}} if loc['snippet']: - status, snippet = v5_4.GitOps.getObjectFromRepo(object = loc['snippet'], authProfiles = d['declaration']['http']['authentication']) + status, snippet = v5_6.GitOps.getObjectFromRepo(object = loc['snippet'], authProfiles = d['declaration']['http']['authentication']) if status != 200: return {"status_code": 422, "message": {"status_code": status, "message": snippet}} @@ -547,7 +547,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'visibility_dir'] + loc['uri'] + "-moesif-http.conf"} - auxFiles['files'].append(moesifHTTPConfigFile) + configFiles['files'].append(moesifHTTPConfigFile) # Add the rendered Moesif visibility configuration snippet as a config file in the staged configuration - server context templateName = NcgConfig.config['templates'][ @@ -563,7 +563,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn 'visibility_dir'] + loc['uri'] + "-moesif-server.conf"} - auxFiles['files'].append(moesifServerConfigFile) + configFiles['files'].append(moesifServerConfigFile) # API Gateway provisioning if loc['apigateway'] and loc['apigateway']['api_gateway'] and loc['apigateway']['api_gateway']['enabled'] and loc['apigateway']['api_gateway']['enabled'] == True: @@ -605,25 +605,42 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn {"code": status, "content": f"invalid server authentication profile [{openApiAuthProfile[0]['profile']}] for OpenAPI schema [{loc['apigateway']['openapi_schema']['content']}]"}}} - status, apiGatewayConfigDeclaration, openAPISchemaJSON = v5_4.APIGateway.createAPIGateway(locationDeclaration = loc, authProfiles = loc['apigateway']['openapi_schema']['authentication']) + status, apiGatewayConfigDeclaration, openAPISchemaJSON = v5_6.APIGateway.createAPIGateway(locationDeclaration = loc, authProfiles = loc['apigateway']['openapi_schema']['authentication']) + + if status!=200: + return {"status_code": 412, + "message": {"status_code": status, "message": + {"code": status, + "content": f"OpenAPI schema fetch failed for {loc['apigateway']['openapi_schema']['content']}"}}} # API Gateway configuration template rendering if apiGatewayConfigDeclaration: + # API Gateway server / locations file apiGatewaySnippet = j2_env.get_template(NcgConfig.config['templates']['apigwconf']).render( - declaration=apiGatewayConfigDeclaration, enabledVisibility=apiGwVisibilityIntegrations, ncgconfig=NcgConfig.config) + declaration=apiGatewayConfigDeclaration, server=server['names'][0], enabledVisibility=apiGwVisibilityIntegrations, ncgconfig=NcgConfig.config) apiGatewaySnippetb64 = base64.b64encode(bytes(apiGatewaySnippet, 'utf-8')).decode('utf-8') newAuxFile = {'contents': apiGatewaySnippetb64, 'name': NcgConfig.config['nms']['apigw_dir'] + '/' + server['names'][0] + loc['uri'] + ".conf" } - auxFiles['files'].append(newAuxFile) + configFiles['files'].append(newAuxFile) + + # API Gateway maps file for parameters enforcement + apiGatewayMapsSnippet = j2_env.get_template(NcgConfig.config['templates']['apigwmapsconf']).render( + declaration=apiGatewayConfigDeclaration, server=server['names'][0], ncgconfig=NcgConfig.config) + apiGatewayMapsSnippetb64 = base64.b64encode(bytes(apiGatewayMapsSnippet, 'utf-8')).decode('utf-8') + + newAuxFile = {'contents': apiGatewayMapsSnippetb64, 'name': NcgConfig.config['nms']['apigw_maps_dir'] + + '/' + server['names'][0] + + loc['uri'].replace('/', '_') + ".conf" } + configFiles['files'].append(newAuxFile) # API Gateway Developer portal provisioning if loc['apigateway'] and loc['apigateway']['developer_portal'] and 'enabled' in loc['apigateway']['developer_portal'] and loc['apigateway']['developer_portal']['enabled'] == True: if loc['apigateway']['developer_portal']['type'].lower() == 'redocly': ### Redocly developer portal - Add optional API Developer portal HTML files - status, devPortalHTML = v5_4.DevPortal.createDevPortal(locationDeclaration=loc, + status, devPortalHTML = v5_6.DevPortal.createDevPortal(locationDeclaration=loc, authProfiles= d['declaration']['http'][ 'authentication']) @@ -642,7 +659,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn elif loc['apigateway']['developer_portal']['type'].lower() == 'backstage': ### Backstage developer portal - Create Kubernetes Backstage manifest backstageManifest = j2_env.get_template(f"{NcgConfig.config['templates']['devportal_root']}/backstage.tmpl").render( - declaration=loc['apigateway']['developer_portal']['backstage'], openAPISchema = v5_4.MiscUtils.json_to_yaml(openAPISchemaJSON), ncgconfig=NcgConfig.config) + declaration=loc['apigateway']['developer_portal']['backstage'], openAPISchema = v5_6.MiscUtils.json_to_yaml(openAPISchemaJSON), ncgconfig=NcgConfig.config) extraOutputManifests.append(backstageManifest) ### / Backstage developer portal - Create Kubernetes Backstage manifest @@ -678,7 +695,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn # Check Layer4/stream upstreams validity all_upstreams = [] - d_upstreams = v5_4.MiscUtils.getDictKey(d, 'declaration.layer4.upstreams') + d_upstreams = v5_6.MiscUtils.getDictKey(d, 'declaration.layer4.upstreams') if d_upstreams is not None: for i in range(len(d_upstreams)): upstream = d_upstreams[i] @@ -690,7 +707,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn "content": f"invalid resolver profile [{upstream['resolver']}] in stream upstream [{upstream['name']}], must be one of {all_resolver_profiles}"}}} if upstream['snippet']: - status, snippet = v5_4.GitOps.getObjectFromRepo(object = upstream['snippet'], authProfiles = d['declaration']['http']['authentication']) + status, snippet = v5_6.GitOps.getObjectFromRepo(object = upstream['snippet'], authProfiles = d['declaration']['http']['authentication']) if status != 200: return {"status_code": 422, "message": {"status_code": status, "message": snippet}} @@ -708,11 +725,11 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn upstreamProfileConfigFile = {'contents': b64renderedUpstreamProfile, 'name': configFileName} - auxFiles['files'].append(upstreamProfileConfigFile) + configFiles['files'].append(upstreamProfileConfigFile) all_upstreams.append(d_upstreams[i]['name']) - d_servers = v5_4.MiscUtils.getDictKey(d, 'declaration.layer4.servers') + d_servers = v5_6.MiscUtils.getDictKey(d, 'declaration.layer4.servers') if d_servers is not None: for server in d_servers: @@ -725,7 +742,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn "content": f"invalid resolver profile [{server['resolver'] }] in stream server [{server['name']}], must be one of {all_resolver_profiles}"}}} if server['snippet']: - status, snippet = v5_4.GitOps.getObjectFromRepo(object = server['snippet'], authProfiles = d['declaration']['http']['authentication']) + status, snippet = v5_6.GitOps.getObjectFromRepo(object = server['snippet'], authProfiles = d['declaration']['http']['authentication']) if status != 200: return {"status_code": 422, "message": {"status_code": status, "message": snippet}} @@ -744,7 +761,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn streamServerConfb64 = base64.b64encode(bytes(streamServerConf, 'utf-8')).decode('utf-8') newStreamServerAuxFile = {'contents': streamServerConfb64, 'name': NcgConfig.config['nms']['server_stream_dir'] + '/' + server['name'].replace(' ', '_') + ".conf"} - auxFiles['files'].append(newStreamServerAuxFile) + configFiles['files'].append(newStreamServerAuxFile) # HTTP configuration template rendering httpConf = j2_env.get_template(NcgConfig.config['templates']['httpconf']).render( @@ -766,7 +783,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn # NGINX auxiliary files for staged config auxFiles['rootDir'] = NcgConfig.config['nms']['config_dir'] - finalReply = v5_4.NIMOutput.NIMOutput(d = d, declaration = declaration, apiversion = apiversion, + finalReply = v5_6.NIMOutput.NIMOutput(d = d, declaration = declaration, apiversion = apiversion, b64HttpConf = b64HttpConf, b64StreamConf = b64StreamConf, configFiles = configFiles, auxFiles = auxFiles, @@ -787,7 +804,7 @@ def createconfig(declaration: ConfigDeclaration, apiversion: str, runfromautosyn # NGINX auxiliary files for staged config auxFiles['name'] = NcgConfig.config['nms']['config_dir'] - finalReply = v5_4.NGINXOneOutput.NGINXOneOutput(d = d, declaration = declaration, apiversion = apiversion, + finalReply = v5_6.NGINXOneOutput.NGINXOneOutput(d = d, declaration = declaration, apiversion = apiversion, b64HttpConf = b64HttpConf, b64StreamConf = b64StreamConf, configFiles = configFiles, auxFiles = auxFiles, @@ -818,51 +835,51 @@ def patch_config(declaration: ConfigDeclaration, configUid: str, apiversion: str status_code, currentDeclaration = get_declaration(configUid=configUid) # Handle policy updates - d_policies = v5_4.MiscUtils.getDictKey(declarationToPatch, 'output.nms.policies') + d_policies = v5_6.MiscUtils.getDictKey(declarationToPatch, 'declaration.http.policies') if d_policies is not None: - # NGINX App Protect WAF policy updates + # F5 WAF for NGINX policy updates for p in d_policies: - currentDeclaration = v5_4.DeclarationPatcher.patchNAPPolicies( + currentDeclaration = v5_6.DeclarationPatcher.patchNAPPolicies( sourceDeclaration=currentDeclaration, patchedNAPPolicies=p) # Handle certificate updates - d_certificates = v5_4.MiscUtils.getDictKey(declarationToPatch, 'output.nms.certificates') + d_certificates = v5_6.MiscUtils.getDictKey(declarationToPatch, 'declaration.certificates') if d_certificates is not None: # TLS certificate/key updates for p in d_certificates: - currentDeclaration = v5_4.DeclarationPatcher.patchCertificates( + currentDeclaration = v5_6.DeclarationPatcher.patchCertificates( sourceDeclaration=currentDeclaration, patchedCertificates=p) # Handle declaration updates if 'declaration' in declarationToPatch: # HTTP - d_upstreams = v5_4.MiscUtils.getDictKey(declarationToPatch, 'declaration.http.upstreams') + d_upstreams = v5_6.MiscUtils.getDictKey(declarationToPatch, 'declaration.http.upstreams') if d_upstreams: # HTTP upstream patch for u in d_upstreams: - currentDeclaration = v5_4.DeclarationPatcher.patchHttpUpstream( + currentDeclaration = v5_6.DeclarationPatcher.patchHttpUpstream( sourceDeclaration=currentDeclaration, patchedHttpUpstream=u) - d_servers = v5_4.MiscUtils.getDictKey(declarationToPatch, 'declaration.http.servers') + d_servers = v5_6.MiscUtils.getDictKey(declarationToPatch, 'declaration.http.servers') if d_servers: # HTTP servers patch for s in d_servers: - currentDeclaration = v5_4.DeclarationPatcher.patchHttpServer( + currentDeclaration = v5_6.DeclarationPatcher.patchHttpServer( sourceDeclaration=currentDeclaration, patchedHttpServer=s) # Stream / Layer4 - d_upstreams = v5_4.MiscUtils.getDictKey(declarationToPatch, 'declaration.layer4.upstreams') + d_upstreams = v5_6.MiscUtils.getDictKey(declarationToPatch, 'declaration.layer4.upstreams') if d_upstreams: # Stream upstream patch for u in d_upstreams: - currentDeclaration = v5_4.DeclarationPatcher.patchStreamUpstream( + currentDeclaration = v5_6.DeclarationPatcher.patchStreamUpstream( sourceDeclaration=currentDeclaration, patchedStreamUpstream=u) - d_servers = v5_4.MiscUtils.getDictKey(declarationToPatch, 'declaration.layer4.servers') + d_servers = v5_6.MiscUtils.getDictKey(declarationToPatch, 'declaration.layer4.servers') if d_servers: # Stream servers patch for s in d_servers: - currentDeclaration = v5_4.DeclarationPatcher.patchStreamServer( + currentDeclaration = v5_6.DeclarationPatcher.patchStreamServer( sourceDeclaration=currentDeclaration, patchedStreamServer=s) # Apply the updated declaration diff --git a/src/V5_4_NginxConfigDeclaration.py b/src/V5_6_NginxConfigDeclaration.py similarity index 96% rename from src/V5_4_NginxConfigDeclaration.py rename to src/V5_6_NginxConfigDeclaration.py index 56246485..ee6b64d3 100644 --- a/src/V5_4_NginxConfigDeclaration.py +++ b/src/V5_6_NginxConfigDeclaration.py @@ -1,5 +1,5 @@ """ -JSON declaration structure +JSON declaration structure - NGINX Declarative API v5.6 """ from __future__ import annotations @@ -12,13 +12,13 @@ alphanumRegexp = r'^[a-zA-Z0-9\ \-\_]+$' -class NmsCertificate(BaseModel, extra="forbid"): +class TLSCertificate(BaseModel, extra="forbid"): type: str name: str contents: Optional[ObjectFromSourceOfTruth] = {} @model_validator(mode='after') - def check_type(self) -> 'NmsCertificate': + def check_type(self) -> 'TLSCertificate': _type = self.type valid = ['certificate', 'key'] @@ -108,9 +108,6 @@ class OutputNMS(BaseModel, extra="forbid"): instancegroup: str = "" synctime: Optional[int] = 0 modules: Optional[List[str]] = [] - certificates: Optional[List[NmsCertificate]] = [] - policies: Optional[List[NGINXPolicy]] = [] - log_profiles: Optional[List[LogProfile]] = [] class OutputNGINXOne(BaseModel, extra="forbid"): @@ -120,9 +117,6 @@ class OutputNGINXOne(BaseModel, extra="forbid"): configsyncgroup: str = "" synctime: Optional[int] = 0 modules: Optional[List[str]] = [] - certificates: Optional[List[NmsCertificate]] = [] - policies: Optional[List[NGINXPolicy]] = [] - log_profiles: Optional[List[LogProfile]] = [] class License(BaseModel, extra="forbid"): @@ -130,6 +124,9 @@ class License(BaseModel, extra="forbid"): token: Optional[str] = "" ssl_verify: bool = True grace_period: bool = False + proxy: Optional[str] = "" + proxy_username: Optional[str] = "" + proxy_password: Optional[str] = "" class Output(BaseModel, extra="forbid"): @@ -749,6 +746,8 @@ class Map(BaseModel, extra="forbid"): class Layer4(BaseModel, extra="forbid"): servers: Optional[List[L4Server]] = [] upstreams: Optional[List[L4Upstream]] = [] + certificates: Optional[List[TLSCertificate]] = [] + logformats: Optional[List[L4LogFormat]] = [] class Resolver(BaseModel, extra="forbid"): @@ -768,13 +767,29 @@ def check_type(self) -> 'Resolver': return self -class LogFormat(BaseModel, extra="forbid"): +class L4LogFormat(BaseModel, extra="forbid"): + name: str + escape: str = "default" + format: str + + @model_validator(mode='after') + def check_type(self) -> 'L4LogFormat': + escape = self.escape + + valid = ['default', 'json', 'none'] + if escape not in valid: + raise ValueError(f"Invalid escape mode [{escape}] must be one of {str(valid)}") + + return self + + +class HttpLogFormat(BaseModel, extra="forbid"): name: str escape: str = "default" format: str @model_validator(mode='after') - def check_type(self) -> 'LogFormat': + def check_type(self) -> 'HttpLogFormat': escape = self.escape valid = ['default', 'json', 'none'] @@ -925,15 +940,18 @@ class Http(BaseModel, extra="forbid"): njs: Optional[List[NjsHookHttpServer]] = [] njs_profiles: Optional[List[NjsFile]] = [] cache: Optional[List[CacheProfile]] = [] - logformats: Optional[List[LogFormat]] = [] + logformats: Optional[List[HttpLogFormat]] = [] resolver: Optional[str] = "" acme_issuers: Optional[List[AcmeIssuers]] = [] + policies: Optional[List[NGINXPolicy]] = [] + log_profiles: Optional[List[LogProfile]] = [] class Declaration(BaseModel, extra="forbid"): layer4: Optional[Layer4] = {} http: Optional[Http] = {} resolvers: Optional[List[Resolver]] = [] + certificates: Optional[List[TLSCertificate]] = [] class API_Gateway(BaseModel, extra="forbid"): diff --git a/src/main.py b/src/main.py index 20088723..28b05cb5 100644 --- a/src/main.py +++ b/src/main.py @@ -6,7 +6,6 @@ import json import threading import time -import queue import schedule import uvicorn @@ -17,15 +16,15 @@ import NcgConfig from NcgRedis import NcgRedis -import V5_4_CreateConfig -import V5_4_NginxConfigDeclaration -import v5_4.Asynchronous - import V5_5_CreateConfig import V5_5_NginxConfigDeclaration import v5_5.Asynchronous -cfg = NcgConfig.NcgConfig(configFile="../etc/config.toml") +import V5_6_CreateConfig +import V5_6_NginxConfigDeclaration +import v5_6.Asynchronous + +cfg = NcgConfig.NcgConfig(configFile="../etc/config.yaml") redis = NcgRedis(host=cfg.config['redis']['host'], port=cfg.config['redis']['port']) app = FastAPI( @@ -53,23 +52,20 @@ def runAsynchronousWorker(): print(f"Processing asynchronous declaration: API [{item['apiVersion']}] method [{item['method']}] configUid [{item['configUid']}] submissionUid [{item['submissionUid']}]") declaration = item['declaration'] - if item['apiVersion'] == 'v5.4': - response = V5_4_CreateConfig.patch_config(declaration = declaration, configUid = item['configUid'], apiversion = item['apiVersion']) - elif item['apiVersion'] == 'v5.5': + if item['apiVersion'] == 'v5.5': response = V5_5_CreateConfig.patch_config(declaration = declaration, configUid = item['configUid'], apiversion = item['apiVersion']) + elif item['apiVersion'] == 'v5.6': + response = V5_6_CreateConfig.patch_config(declaration = declaration, configUid = item['configUid'], apiversion = item['apiVersion']) NcgRedis.redis.set(f"ncg.async.submission.{item['submissionUid']}", response.body.decode("utf-8")) redis.asyncQueue.task_done() -# Submit declaration using v5.4 API -@app.post("/v5.4/config", status_code=200, response_class=PlainTextResponse) -def post_config_v5_4(d: V5_4_NginxConfigDeclaration.ConfigDeclaration, response: Response): - output = V5_4_CreateConfig.createconfig(declaration=d, apiversion='v5.4') - #if type(output) in [Response, str]: - # # ConfigMap or plaintext response - # return output +# Submit declaration using v5.5 API +@app.post("/v5.5/config", status_code=200, response_class=PlainTextResponse) +def post_config_v5_5(d: V5_5_NginxConfigDeclaration.ConfigDeclaration, response: Response): + output = V5_5_CreateConfig.createconfig(declaration=d, apiversion='v5.5') headers = output['message']['headers'] if 'headers' in output['message'] else {'Content-Type': 'application/json'} @@ -84,14 +80,10 @@ def post_config_v5_4(d: V5_4_NginxConfigDeclaration.ConfigDeclaration, response: return JSONResponse(content=response, status_code=output['status_code'], headers=headers) -# Submit declaration using v5.5 API -@app.post("/v5.5/config", status_code=200, response_class=PlainTextResponse) -def post_config_v5_5(d: V5_5_NginxConfigDeclaration.ConfigDeclaration, response: Response): - output = V5_5_CreateConfig.createconfig(declaration=d, apiversion='v5.5') - - #if type(output) in [Response, str]: - # # ConfigMap or plaintext response - # return output +# Submit declaration using v5.6 API +@app.post("/v5.6/config", status_code=200, response_class=PlainTextResponse) +def post_config_v5_6(d: V5_6_NginxConfigDeclaration.ConfigDeclaration, response: Response): + output = V5_6_CreateConfig.createconfig(declaration=d, apiversion='v5.6') headers = output['message']['headers'] if 'headers' in output['message'] else {'Content-Type': 'application/json'} @@ -106,34 +98,34 @@ def post_config_v5_5(d: V5_5_NginxConfigDeclaration.ConfigDeclaration, response: return JSONResponse(content=response, status_code=output['status_code'], headers=headers) -# Modify declaration using v5.4 API -@app.patch("/v5.4/config/{configuid}", status_code=200, response_class=PlainTextResponse) -def patch_config_v5_4(d: V5_4_NginxConfigDeclaration.ConfigDeclaration, response: Response, configuid: str): - retcode, response = v5_4.Asynchronous.checkIfAsynch(declaration = d, method = 'PATCH', apiVersion = 'v5.4', configUid = configuid) +# Modify declaration using v5.5 API +@app.patch("/v5.5/config/{configuid}", status_code=200, response_class=PlainTextResponse) +def patch_config_v5_5(d: V5_5_NginxConfigDeclaration.ConfigDeclaration, response: Response, configuid: str): + retcode, response = v5_5.Asynchronous.checkIfAsynch(declaration = d, method = 'PATCH', apiVersion = 'v5.5', configUid = configuid) if retcode is not None: # Request was asynchronous and it has been submitted to the FIFO queue return JSONResponse(content=response, status_code = retcode, headers = {'Content-Type': 'application/json'}) - return V5_4_CreateConfig.patch_config(declaration=d, configUid=configuid, apiversion='v5.4') + return V5_5_CreateConfig.patch_config(declaration=d, configUid=configuid, apiversion='v5.5') -# Modify declaration using v5.5 API -@app.patch("/v5.5/config/{configuid}", status_code=200, response_class=PlainTextResponse) -def patch_config_v5_5(d: V5_5_NginxConfigDeclaration.ConfigDeclaration, response: Response, configuid: str): - retcode, response = v5_5.Asynchronous.checkIfAsynch(declaration = d, method = 'PATCH', apiVersion = 'v5.5', configUid = configuid) +# Modify declaration using v5.6 API +@app.patch("/v5.6/config/{configuid}", status_code=200, response_class=PlainTextResponse) +def patch_config_v5_6(d: V5_6_NginxConfigDeclaration.ConfigDeclaration, response: Response, configuid: str): + retcode, response = v5_6.Asynchronous.checkIfAsynch(declaration = d, method = 'PATCH', apiVersion = 'v5.6', configUid = configuid) if retcode is not None: # Request was asynchronous and it has been submitted to the FIFO queue return JSONResponse(content=response, status_code = retcode, headers = {'Content-Type': 'application/json'}) - return V5_5_CreateConfig.patch_config(declaration=d, configUid=configuid, apiversion='v5.5') + return V5_6_CreateConfig.patch_config(declaration=d, configUid=configuid, apiversion='v5.6') -# Get declaration - v5.4 API -@app.get("/v5.4/config/{configuid}", status_code=200, response_class=PlainTextResponse) -def get_config_declaration_v5_4(configuid: str): - status_code, content = V5_4_CreateConfig.get_declaration(configUid=configuid) +# Get declaration - v5.5 API +@app.get("/v5.5/config/{configuid}", status_code=200, response_class=PlainTextResponse) +def get_config_declaration_v5_5(configuid: str): + status_code, content = V5_5_CreateConfig.get_declaration(configUid=configuid) if status_code == 404: return JSONResponse( @@ -149,10 +141,10 @@ def get_config_declaration_v5_4(configuid: str): ) -# Get declaration - v5.5 API -@app.get("/v5.5/config/{configuid}", status_code=200, response_class=PlainTextResponse) -def get_config_declaration_v5_5(configuid: str): - status_code, content = V5_5_CreateConfig.get_declaration(configUid=configuid) +# Get declaration - v5.6 API +@app.get("/v5.6/config/{configuid}", status_code=200, response_class=PlainTextResponse) +def get_config_declaration_v5_6(configuid: str): + status_code, content = V5_6_CreateConfig.get_declaration(configUid=configuid) if status_code == 404: return JSONResponse( @@ -169,8 +161,8 @@ def get_config_declaration_v5_5(configuid: str): # Get declaration status -@app.get("/v5.4/config/{configuid}/status", status_code=200, response_class=PlainTextResponse) @app.get("/v5.5/config/{configuid}/status", status_code=200, response_class=PlainTextResponse) +@app.get("/v5.6/config/{configuid}/status", status_code=200, response_class=PlainTextResponse) def get_config_status(configuid: str): status = redis.redis.get('ncg.status.' + configuid) @@ -188,8 +180,8 @@ def get_config_status(configuid: str): ) -# Get asynchronous submission status - v5.4 API -@app.get("/v5.4/config/{configuid}/submission/{submissionuid}", status_code=200, response_class=PlainTextResponse) +# Get asynchronous submission status - v5.5 API +@app.get("/v5.5/config/{configuid}/submission/{submissionuid}", status_code=200, response_class=PlainTextResponse) def get_submission_status(configuid: str, submissionuid: str): status = redis.redis.get('ncg.async.submission.' + submissionuid) @@ -215,8 +207,8 @@ def get_submission_status(configuid: str, submissionuid: str): ) -# Get asynchronous submission status - v5.5 API -@app.get("/v5.5/config/{configuid}/submission/{submissionuid}", status_code=200, response_class=PlainTextResponse) +# Get asynchronous submission status - v5.6 API +@app.get("/v5.6/config/{configuid}/submission/{submissionuid}", status_code=200, response_class=PlainTextResponse) def get_submission_status(configuid: str, submissionuid: str): status = redis.redis.get('ncg.async.submission.' + submissionuid) @@ -243,8 +235,8 @@ def get_submission_status(configuid: str, submissionuid: str): # Delete declaration -@app.delete("/v5.4/config/{configuid}", status_code=200, response_class=PlainTextResponse) @app.delete("/v5.5/config/{configuid}", status_code=200, response_class=PlainTextResponse) +@app.delete("/v5.6/config/{configuid}", status_code=200, response_class=PlainTextResponse) def delete_config(configuid: str = ""): if configuid not in redis.declarationsList: return JSONResponse( @@ -283,6 +275,29 @@ def get_schema_v5_5(): return JSONResponse(content=schema, headers={'Content-Type': 'application/json'}) +if __name__ == '__main__': + print(f"{cfg.config['main']['banner']} {cfg.config['main']['version']}") + + print("Starting GitOps scheduler") + threading.Thread(target=runGitOpsScheduler).start() + + print("Starting Asynchronous declarations scheduler") + threading.Thread(target=runAsynchronousWorker, daemon=True).start() + + apiServerHost = cfg.config['apiserver']['host'] + apiServerPort = cfg.config['apiserver']['port'] + + print(f"Starting API server on {apiServerHost}:{apiServerPort}") + uvicorn.run("main:app", host=apiServerHost, port=apiServerPort) + + +# Get JSON schema for the v5.6 ConfigDeclaration - used by the Web UI editor for IntelliSense +@app.get("/v5.6/schema", status_code=200) +def get_schema_v5_6(): + schema = V5_6_NginxConfigDeclaration.ConfigDeclaration.model_json_schema() + return JSONResponse(content=schema, headers={'Content-Type': 'application/json'}) + + if __name__ == '__main__': print(f"{cfg.config['main']['banner']} {cfg.config['main']['version']}") diff --git a/src/v5_4/OpenAPIParser.py b/src/v5_4/OpenAPIParser.py deleted file mode 100644 index 6c65195c..00000000 --- a/src/v5_4/OpenAPIParser.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -OpenAPI schema parser support functions -""" - -import json - -class OpenAPIParser: - httpMethods = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'] - - def __init__(self, openAPISchema): - self.openAPISchema = openAPISchema - - def version(self): - if 'openapi' in self.openAPISchema: - return self.openAPISchema['openapi'] - elif 'swagger' in self.openAPISchema: - return self.openAPISchema['swagger'] - - return None - - def info(self): - if 'info' in self.openAPISchema: - return self.openAPISchema['info'] - - return None - - def servers(self): - self.allServers = [] - - # Loop over OpenAPI schema servers - if 'servers' in self.openAPISchema: - for server in self.openAPISchema['servers']: - urlName = server['url'] - self.s = {} - self.s['url'] = urlName - - if 'description' in server: - self.s['description'] = server['description'] - - self.allServers.append(self.s) - - return self.allServers - - def paths(self): - self.allPaths = [] - - # Loop over OpenAPI schema paths - if 'paths' in self.openAPISchema: - for path in self.openAPISchema['paths'].keys(): - #print(f"- {path}") - self.p = {} - self.p['path'] = path - self.p['methods'] = [] - - # Loop over path HTTP methods found in schema - for method in self.openAPISchema['paths'][path].keys(): - methodInfo = self.openAPISchema['paths'][path][method] - - if method.upper() in self.httpMethods: - self.m = {} - self.m['method'] = method - self.m['details'] = {} - - if 'description' in methodInfo and methodInfo['description']: - self.m['details']['description'] = methodInfo['description'] - if 'operationId' in methodInfo and methodInfo['operationId']: - self.m['details']['operationId'] = methodInfo['operationId'] - - self.p['methods'].append(self.m) - - self.allPaths.append(self.p) - - return self.allPaths diff --git a/src/v5_5/NGINXOneNAPUtils.py b/src/v5_5/NGINXOneNAPUtils.py index 9eecd999..c6421122 100644 --- a/src/v5_5/NGINXOneNAPUtils.py +++ b/src/v5_5/NGINXOneNAPUtils.py @@ -6,7 +6,7 @@ import json import base64 -import v5_4.GitOps +import v5_5.GitOps from NcgConfig import NcgConfig @@ -187,7 +187,7 @@ def provisionPolicies(nginxOneUrl: str, nginxOneToken: str, nginxOneNamespace: s # Create all policy versions for policyVersion in p['versions']: - status, policyBody = v5_4.GitOps.getObjectFromRepo(policyVersion['contents'],base64Encode=False) + status, policyBody = v5_5.GitOps.getObjectFromRepo(policyVersion['contents'],base64Encode=False) if status != 200: return JSONResponse( diff --git a/src/v5_5/NGINXOneOutput.py b/src/v5_5/NGINXOneOutput.py index 5e49eea0..3201b077 100644 --- a/src/v5_5/NGINXOneOutput.py +++ b/src/v5_5/NGINXOneOutput.py @@ -87,7 +87,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo # Check TLS items validity all_tls = {'certificate': {}, 'key': {}} - d_certs = v5_5.MiscUtils.getDictKey(d, 'output.nginxone.certificates') + d_certs = v5_5.MiscUtils.getDictKey(d, 'declaration.http.certificates') if d_certs is not None: for i in range(len(d_certs)): if d_certs[i]['name']: @@ -146,10 +146,10 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo issuer['name']) +"] must be one of [" + ",".join(all_tls['certificate']) + "]"} }} - # Add optional certificates specified under output.nginxone.certificates + # Add optional certificates specified under declaration.http.certificates extensions_map = {'certificate': '.crt', 'key': '.key'} - d_certificates = v5_5.MiscUtils.getDictKey(d, 'output.nginxone.certificates') + d_certificates = v5_5.MiscUtils.getDictKey(d, 'declaration.http.certificates') if d_certificates is not None: for c in d_certificates: status, certContent = v5_5.GitOps.getObjectFromRepo(object=c['contents'], @@ -163,7 +163,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo '/' + c['name'] + extensions_map[c['type']]} auxFiles['files'].append(newAuxFile) - ### / Add optional certificates specified under output.nginxone.certificates + ### / Add optional certificates specified under declaration.http.certificates # NGINX main configuration file through template j2_env = Environment(loader=FileSystemLoader(NcgConfig.config['templates']['root_dir'] + '/' + apiversion), diff --git a/src/v5_5/NIMNAPUtils.py b/src/v5_5/NIMNAPUtils.py index 31bfa66e..ba9290bc 100644 --- a/src/v5_5/NIMNAPUtils.py +++ b/src/v5_5/NIMNAPUtils.py @@ -6,7 +6,7 @@ import json import base64 -import v5_4.GitOps +import v5_5.GitOps from NcgConfig import NcgConfig @@ -15,7 +15,7 @@ available_log_profiles = ['log_all', 'log_blocked', 'log_illegal', 'secops_dashboard'] -# Define (create/update) a F5 WAF for NGINX policy on NMS. +# Define (create/update) a F5 WAF for NGINX policy on NGINX Instance Manager. # If policyUid is not empty the policy update is performed # Returns a tuple {status_code,text}. status_code is 201 if successful def __definePolicyOnNMS__(nmsUrl: str, nmsUsername: str, nmsPassword: str, policyName: str, policyDisplayName: str, @@ -173,7 +173,7 @@ def provisionPolicies(nmsUrl: str, nmsUsername: str, nmsPassword: str, declarati if p['type'] == 'app_protect': # Iterates over all policy versions for policyVersion in p['versions']: - status, policyBody = v5_4.GitOps.getObjectFromRepo(policyVersion['contents']) + status, policyBody = v5_5.GitOps.getObjectFromRepo(policyVersion['contents']) if status != 200: return JSONResponse( diff --git a/src/v5_4/APIGateway.py b/src/v5_6/APIGateway.py similarity index 75% rename from src/v5_4/APIGateway.py rename to src/v5_6/APIGateway.py index e3a187e3..502826fd 100644 --- a/src/v5_4/APIGateway.py +++ b/src/v5_6/APIGateway.py @@ -4,12 +4,12 @@ import json -import v5_4.GitOps -import v5_4.MiscUtils -from v5_4.OpenAPIParser import OpenAPIParser +import v5_6.GitOps +import v5_6.MiscUtils +from v5_6.OpenAPIParser import OpenAPIParser # pydantic models -from V5_4_NginxConfigDeclaration import * +from V5_6_NginxConfigDeclaration import * # Builds the declarative JSON for the API Gateway configuration @@ -18,12 +18,15 @@ def createAPIGateway(locationDeclaration: dict, authProfiles: Authentication={}) apiGwDeclaration = {} if locationDeclaration['apigateway']['openapi_schema']: - status, apiSchemaString = v5_4.GitOps.getObjectFromRepo(object=locationDeclaration['apigateway']['openapi_schema'], + status, apiSchemaString = v5_6.GitOps.getObjectFromRepo(object=locationDeclaration['apigateway']['openapi_schema'], authProfiles = authProfiles['server'] if 'server' in authProfiles else {}, base64Encode=False) - if v5_4.MiscUtils.yaml_or_json(apiSchemaString['content']) == 'yaml': + if status != 200: + return status,"","" + + if v5_6.MiscUtils.yaml_or_json(apiSchemaString['content']) == 'yaml': # YAML to JSON conversion - apiSchemaString['content'] = v5_4.MiscUtils.yaml_to_json(apiSchemaString['content']) + apiSchemaString['content'] = v5_6.MiscUtils.yaml_to_json(apiSchemaString['content']) apiSchema = OpenAPIParser(json.loads(apiSchemaString['content'])) diff --git a/src/v5_4/Asynchronous.py b/src/v5_6/Asynchronous.py similarity index 87% rename from src/v5_4/Asynchronous.py rename to src/v5_6/Asynchronous.py index 707a8385..12225696 100644 --- a/src/v5_4/Asynchronous.py +++ b/src/v5_6/Asynchronous.py @@ -4,11 +4,11 @@ import json import pickle -import v5_4.MiscUtils +import v5_6.MiscUtils from NcgRedis import NcgRedis # pydantic models -from V5_4_NginxConfigDeclaration import ConfigDeclaration +from V5_6_NginxConfigDeclaration import ConfigDeclaration # # Check if the incoming request is asynchronous @@ -21,7 +21,7 @@ def checkIfAsynch(declaration: ConfigDeclaration, method: str, apiVersion: str, return None, None # Asynchronous declaration, submit to FIFO queue - submissionUid = str(v5_4.MiscUtils.getuniqueid()) + submissionUid = str(v5_6.MiscUtils.getuniqueid()) submissionPayload = {'declaration': declaration, 'method': method, 'configUid': configUid, "apiVersion": apiVersion, "submissionUid": submissionUid} NcgRedis.asyncQueue.put(submissionPayload) diff --git a/src/v5_4/DeclarationPatcher.py b/src/v5_6/DeclarationPatcher.py similarity index 91% rename from src/v5_4/DeclarationPatcher.py rename to src/v5_6/DeclarationPatcher.py index 51260a4c..41462008 100644 --- a/src/v5_4/DeclarationPatcher.py +++ b/src/v5_6/DeclarationPatcher.py @@ -161,23 +161,23 @@ def patchNAPPolicies(sourceDeclaration: dict, patchedNAPPolicies: dict): haveWePatched = False - if 'output' not in sourceDeclaration: + if 'declaration' not in sourceDeclaration: return sourceDeclaration - if 'nms' not in sourceDeclaration['output']: + if 'http' not in sourceDeclaration['declaration']: return sourceDeclaration - if 'policies' not in sourceDeclaration['output']['nms']: + if 'policies' not in sourceDeclaration['declaration']['http']: return sourceDeclaration - # NGINX App Protect WAF policies patch - for p in sourceDeclaration['output']['nms']['policies']: + # F5 WAF for NGINX policies patch + for p in sourceDeclaration['declaration']['http']['policies']: if 'type' in p and p['type'] == 'app_protect' \ and 'name' in p and p['name'] \ and p['type'] == patchedNAPPolicies['type'] \ and p['name'] == patchedNAPPolicies['name']: - # Patching an existing NGINX App Protect WAF policy, 'name' is the key + # Patching an existing F5 WAF for NGINX policy, 'name' is the key if patchedNAPPolicies['versions'] and patchedNAPPolicies['active_tag']: # Patching NAP policy specifying 'versions' and 'active_tag' means updating # If 'versions' and 'active_tag' are missing then it's a deletion @@ -192,7 +192,7 @@ def patchNAPPolicies(sourceDeclaration: dict, patchedNAPPolicies: dict): # The NAP policy being patched is a new one, let's add it allTargetPolicies.append(patchedNAPPolicies) - sourceDeclaration['output']['nms']['policies'] = allTargetPolicies + sourceDeclaration['declaration']['http']['policies'] = allTargetPolicies return sourceDeclaration @@ -203,17 +203,17 @@ def patchCertificates(sourceDeclaration: dict, patchedCertificates: dict): haveWePatched = False - if 'output' not in sourceDeclaration: + if 'declaration' not in sourceDeclaration: return sourceDeclaration - if 'nms' not in sourceDeclaration['output']: + if 'http' not in sourceDeclaration['declaration']: return sourceDeclaration - if 'certificates' not in sourceDeclaration['output']['nms']: + if 'certificates' not in sourceDeclaration['declaration']['http']: return sourceDeclaration # TLS certificates patch - for c in sourceDeclaration['output']['nms']['certificates']: + for c in sourceDeclaration['declaration']['http']['certificates']: if 'type' in c and c['type'] in ['certificate', 'key'] \ and 'name' in c and c['name'] \ and c['type'] == patchedCertificates['type'] \ @@ -233,6 +233,6 @@ def patchCertificates(sourceDeclaration: dict, patchedCertificates: dict): # The TLS certificate/key being patched is a new one, let's add it allTargetCertificates.append(patchedCertificates) - sourceDeclaration['output']['nms']['certificates'] = allTargetCertificates + sourceDeclaration['declaration']['http']['certificates'] = allTargetCertificates return sourceDeclaration diff --git a/src/v5_4/DevPortal.py b/src/v5_6/DevPortal.py similarity index 84% rename from src/v5_4/DevPortal.py rename to src/v5_6/DevPortal.py index a61be855..178c7f65 100644 --- a/src/v5_4/DevPortal.py +++ b/src/v5_6/DevPortal.py @@ -8,11 +8,11 @@ # NGINX Declarative API modules from NcgConfig import NcgConfig -import v5_4.GitOps -import v5_4.MiscUtils +import v5_6.GitOps +import v5_6.MiscUtils # pydantic models -from V5_4_NginxConfigDeclaration import * +from V5_6_NginxConfigDeclaration import * def buildDevPortal(openapischema): try: @@ -29,12 +29,12 @@ def buildDevPortal(openapischema): # Return a tuple: status, description. If status = 200 things were successful def createDevPortal(locationDeclaration: dict, authProfiles: Authentication={}): if locationDeclaration['apigateway']['openapi_schema']: - status, apiSchemaString = v5_4.GitOps.getObjectFromRepo( + status, apiSchemaString = v5_6.GitOps.getObjectFromRepo( object = locationDeclaration['apigateway']['openapi_schema'], authProfiles = authProfiles['server'] if 'server' in authProfiles else {}, base64Encode = False) - if v5_4.MiscUtils.yaml_or_json(apiSchemaString['content']) == 'yaml': + if v5_6.MiscUtils.yaml_or_json(apiSchemaString['content']) == 'yaml': # YAML to JSON conversion - status, devportalJSON = buildDevPortal(openapischema = v5_4.MiscUtils.yaml_to_json(apiSchemaString['content'])) + status, devportalJSON = buildDevPortal(openapischema = v5_6.MiscUtils.yaml_to_json(apiSchemaString['content'])) else: status, devportalJSON = buildDevPortal(openapischema = apiSchemaString['content']) diff --git a/src/v5_4/GitOps.py b/src/v5_6/GitOps.py similarity index 96% rename from src/v5_4/GitOps.py rename to src/v5_6/GitOps.py index bf990dd2..0bb1f693 100644 --- a/src/v5_4/GitOps.py +++ b/src/v5_6/GitOps.py @@ -7,10 +7,10 @@ from requests import ReadTimeout, HTTPError, Timeout, ConnectionError, ConnectTimeout -import v5_4.MiscUtils +import v5_6.MiscUtils # pydantic models -from V5_4_NginxConfigDeclaration import * +from V5_6_NginxConfigDeclaration import * # Fetches a URL content @@ -75,7 +75,7 @@ def getObjectFromRepo(object: ObjectFromSourceOfTruth, authProfiles: Authenticat else: # Object is specified directly into the JSON payload, perform base64 decoding if needed if not base64Encode: - if v5_4.MiscUtils.isBase64(object['content']): + if v5_6.MiscUtils.isBase64(object['content']): response['content'] = base64.b64decode(object['content']).decode(); else: response['content'] = object['content'] diff --git a/src/v5_4/MiscUtils.py b/src/v5_6/MiscUtils.py similarity index 95% rename from src/v5_4/MiscUtils.py rename to src/v5_6/MiscUtils.py index ced5b9f0..294b3a8f 100644 --- a/src/v5_4/MiscUtils.py +++ b/src/v5_6/MiscUtils.py @@ -37,7 +37,7 @@ def yaml_or_json(document: str): # YAML to JSON conversion def yaml_to_json(document: str): - return json.dumps(yaml.safe_load(document)) + return json.dumps(yaml.load(document, Loader=yaml.BaseLoader)) # JSON TO YAML conversion diff --git a/src/v5_4/NGINXOneNAPUtils.py b/src/v5_6/NGINXOneNAPUtils.py similarity index 77% rename from src/v5_4/NGINXOneNAPUtils.py rename to src/v5_6/NGINXOneNAPUtils.py index 9eecd999..ea24b610 100644 --- a/src/v5_4/NGINXOneNAPUtils.py +++ b/src/v5_6/NGINXOneNAPUtils.py @@ -6,7 +6,7 @@ import json import base64 -import v5_4.GitOps +import v5_6.GitOps from NcgConfig import NcgConfig @@ -170,57 +170,58 @@ def provisionPolicies(nginxOneUrl: str, nginxOneToken: str, nginxOneNamespace: s # 'staging-policy': '7b4b850a-ff9e-42a0-85d0-850171474224' } all_policy_active_names_and_uids = {} - for p in declaration['output']['nginxone']['policies']: - policy_name = p['name'] - if policy_name: - policy_active_tag = p['active_tag'] - - # Iterates over all NGINX App Protect policies - if p['type'] == 'app_protect': - # Iterates over all policy versions - - # Remove pre-existing policy versions - allPoliciesJSON = __getAllPolicies__(nginxOneUrl=nginxOneUrl, nginxOneToken=nginxOneToken, nginxOneNamespace=nginxOneNamespace) - polId = __getPolicyId__(allPoliciesJSON = json.loads(allPoliciesJSON.text), policyName=policy_name) - if polId != "": - __deletePolicy__(nginxOneUrl=nginxOneUrl, nginxOneToken=nginxOneToken, nginxOneNamespace=nginxOneNamespace, policyUids=[polId]) - - # Create all policy versions - for policyVersion in p['versions']: - status, policyBody = v5_4.GitOps.getObjectFromRepo(policyVersion['contents'],base64Encode=False) - - if status != 200: - return JSONResponse( - status_code=422, - content={"code": status, - "details": policyBody['content']} + if 'http' in declaration['declaration'] and 'policies' in declaration['declaration']['http']: + for p in declaration['declaration']['http']['policies']: + policy_name = p['name'] + if policy_name: + policy_active_tag = p['active_tag'] + + # Iterates over all NGINX App Protect policies + if p['type'] == 'app_protect': + # Iterates over all policy versions + + # Remove pre-existing policy versions + allPoliciesJSON = __getAllPolicies__(nginxOneUrl=nginxOneUrl, nginxOneToken=nginxOneToken, nginxOneNamespace=nginxOneNamespace) + polId = __getPolicyId__(allPoliciesJSON = json.loads(allPoliciesJSON.text), policyName=policy_name) + if polId != "": + __deletePolicy__(nginxOneUrl=nginxOneUrl, nginxOneToken=nginxOneToken, nginxOneNamespace=nginxOneNamespace, policyUids=[polId]) + + # Create all policy versions + for policyVersion in p['versions']: + status, policyBody = v5_6.GitOps.getObjectFromRepo(policyVersion['contents'],base64Encode=False) + + if status != 200: + return JSONResponse( + status_code=422, + content={"code": status, + "details": policyBody['content']} + ) + + # Create the NGINX App Protect policy on NGINX One Console + r = __definePolicyOnNGINXOne__( + nginxOneUrl=nginxOneUrl, nginxOneToken=nginxOneToken, nginxOneNamespace=nginxOneNamespace, + policyJson=policyBody['content'] ) - # Create the NGINX App Protect policy on NGINX One Console - r = __definePolicyOnNGINXOne__( - nginxOneUrl=nginxOneUrl, nginxOneToken=nginxOneToken, nginxOneNamespace=nginxOneNamespace, - policyJson=policyBody['content'] - ) - - # Check for errors creating NGINX App Protect policy - if r.status_code != 201: - return JSONResponse( - status_code=r.status_code, - content={"code": r.status_code, "details": json.loads(r.text)} - ) - else: - # Policy was created, retrieve metadata.uid for each policy version - if policy_name not in all_policy_names_and_versions: - all_policy_names_and_versions[policy_name] = [] - - # Stores the policy version - uid = json.loads(r.text)['latest']['object_id'] - tag = policyVersion['tag'] - - if policy_active_tag == tag: - all_policy_active_names_and_uids[policy_name] = uid - - all_policy_names_and_versions[policy_name].append({'tag': tag, 'uid': uid}) + # Check for errors creating NGINX App Protect policy + if r.status_code != 201: + return JSONResponse( + status_code=r.status_code, + content={"code": r.status_code, "details": json.loads(r.text)} + ) + else: + # Policy was created, retrieve metadata.uid for each policy version + if policy_name not in all_policy_names_and_versions: + all_policy_names_and_versions[policy_name] = [] + + # Stores the policy version + uid = json.loads(r.text)['latest']['object_id'] + tag = policyVersion['tag'] + + if policy_active_tag == tag: + all_policy_active_names_and_uids[policy_name] = uid + + all_policy_names_and_versions[policy_name].append({'tag': tag, 'uid': uid}) return JSONResponse(status_code=200, content={"all_policy_names_and_versions": all_policy_names_and_versions, "all_policy_active_names_and_uids": all_policy_active_names_and_uids}) diff --git a/src/v5_4/NGINXOneOutput.py b/src/v5_6/NGINXOneOutput.py similarity index 88% rename from src/v5_4/NGINXOneOutput.py rename to src/v5_6/NGINXOneOutput.py index 9d78c5a0..eb7dbaa6 100644 --- a/src/v5_4/NGINXOneOutput.py +++ b/src/v5_6/NGINXOneOutput.py @@ -13,21 +13,21 @@ from urllib.parse import urlparse from datetime import datetime -import V5_4_CreateConfig +import V5_6_CreateConfig -import v5_4.APIGateway -import v5_4.DevPortal -import v5_4.DeclarationPatcher -import v5_4.GitOps -import v5_4.MiscUtils -import v5_4.NGINXOneUtils +import v5_6.APIGateway +import v5_6.DevPortal +import v5_6.DeclarationPatcher +import v5_6.GitOps +import v5_6.MiscUtils +import v5_6.NGINXOneUtils # pydantic models -from V5_4_NginxConfigDeclaration import * +from V5_6_NginxConfigDeclaration import * # NGINX App Protect helper functions # NGINX App Protect helper functions -import v5_4.NGINXOneNAPUtils +import v5_6.NGINXOneNAPUtils # NGINX Declarative API modules from NcgConfig import NcgConfig @@ -39,13 +39,13 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo configUid: str = ""): # NGINX One Console Staged Configuration publish - nOneToken = v5_4.MiscUtils.getDictKey(d, 'output.nginxone.token') - nOneConfigSyncGroup = v5_4.MiscUtils.getDictKey(d, 'output.nginxone.configsyncgroup') - nOneNamespace = v5_4.MiscUtils.getDictKey(d, 'output.nginxone.namespace') + nOneToken = v5_6.MiscUtils.getDictKey(d, 'output.nginxone.token') + nOneConfigSyncGroup = v5_6.MiscUtils.getDictKey(d, 'output.nginxone.configsyncgroup') + nOneNamespace = v5_6.MiscUtils.getDictKey(d, 'output.nginxone.namespace') - nOneSynctime = v5_4.MiscUtils.getDictKey(d, 'output.nginxone.synctime') + nOneSynctime = v5_6.MiscUtils.getDictKey(d, 'output.nginxone.synctime') - nOneUrlFromJson = v5_4.MiscUtils.getDictKey(d, 'output.nginxone.url') + nOneUrlFromJson = v5_6.MiscUtils.getDictKey(d, 'output.nginxone.url') urlCheck = urlparse(nOneUrlFromJson) if urlCheck.scheme not in ['http', 'https'] or urlCheck.scheme == "" or urlCheck.netloc == "": @@ -55,7 +55,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo "headers": {'Content-Type': 'application/json'}} # DNS resolution check - dnsOutcome, dnsReply = v5_4.MiscUtils.resolveFQDN(urlCheck.netloc) + dnsOutcome, dnsReply = v5_6.MiscUtils.resolveFQDN(urlCheck.netloc) if not dnsOutcome: return {"status_code": 400, "message": {"status_code": 400, "message": {"code": 400, @@ -70,12 +70,12 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo "headers": {'Content-Type': 'application/json'}} # Fetch NGINX App Protect WAF policies from source of truth if needed - d_policies = v5_4.MiscUtils.getDictKey(d, 'output.nginxone.policies') + d_policies = v5_6.MiscUtils.getDictKey(d, 'declaration.http.policies') if d_policies is not None: for policy in d_policies: if 'versions' in policy: for policyVersion in policy['versions']: - status, content = v5_4.GitOps.getObjectFromRepo(object=policyVersion['contents'], + status, content = v5_6.GitOps.getObjectFromRepo(object=policyVersion['contents'], authProfiles=d['declaration']['http'][ 'authentication']) @@ -87,19 +87,19 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo # Check TLS items validity all_tls = {'certificate': {}, 'key': {}} - d_certs = v5_4.MiscUtils.getDictKey(d, 'output.nginxone.certificates') + d_certs = v5_6.MiscUtils.getDictKey(d, 'declaration.certificates') if d_certs is not None: for i in range(len(d_certs)): if d_certs[i]['name']: all_tls[d_certs[i]['type']][d_certs[i]['name']] = True # TLS certificates and key names validity checks for servers - d_servers = v5_4.MiscUtils.getDictKey(d, 'declaration.http.servers') + d_servers = v5_6.MiscUtils.getDictKey(d, 'declaration.http.servers') if d_servers is not None: for server in d_servers: if server['listen'] is not None: if 'tls' in server['listen']: - cert_name = v5_4.MiscUtils.getDictKey(server, 'listen.tls.certificate') + cert_name = v5_6.MiscUtils.getDictKey(server, 'listen.tls.certificate') if cert_name and cert_name not in all_tls['certificate']: return {"status_code": 422, "message": { @@ -110,7 +110,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo server['names']) + "] must be one of [" + ",".join(all_tls['certificate']) + "]"} }} - cert_key = v5_4.MiscUtils.getDictKey(server, 'listen.tls.key') + cert_key = v5_6.MiscUtils.getDictKey(server, 'listen.tls.key') if cert_key and cert_key not in all_tls['key']: return {"status_code": 422, "message": { @@ -120,7 +120,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo server['names']) + "] must be one of [" + ",".join(all_tls['key']) + "]"} }} - trusted_cert_name = v5_4.MiscUtils.getDictKey(server, 'listen.tls.trusted_ca_certificates') + trusted_cert_name = v5_6.MiscUtils.getDictKey(server, 'listen.tls.trusted_ca_certificates') if trusted_cert_name and trusted_cert_name not in all_tls['certificate']: return {"status_code": 422, "message": { @@ -132,7 +132,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo }} # TLS certificates and key names validity checks or ACME issuer profiles - d_acmeissuers = v5_4.MiscUtils.getDictKey(d, 'declaration.http.acme_issuers') + d_acmeissuers = v5_6.MiscUtils.getDictKey(d, 'declaration.http.acme_issuers') if d_acmeissuers is not None: for issuer in d_acmeissuers: cert_name = issuer['ssl_trusted_certificate'] @@ -146,13 +146,13 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo issuer['name']) +"] must be one of [" + ",".join(all_tls['certificate']) + "]"} }} - # Add optional certificates specified under output.nginxone.certificates + # Add optional certificates specified under declaration.certificates extensions_map = {'certificate': '.crt', 'key': '.key'} - d_certificates = v5_4.MiscUtils.getDictKey(d, 'output.nginxone.certificates') + d_certificates = v5_6.MiscUtils.getDictKey(d, 'declaration.certificates') if d_certificates is not None: for c in d_certificates: - status, certContent = v5_4.GitOps.getObjectFromRepo(object=c['contents'], + status, certContent = v5_6.GitOps.getObjectFromRepo(object=c['contents'], authProfiles=d['declaration']['http']['authentication']) if status != 200: @@ -163,7 +163,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo '/' + c['name'] + extensions_map[c['type']]} auxFiles['files'].append(newAuxFile) - ### / Add optional certificates specified under output.nginxone.certificates + ### / Add optional certificates specified under declaration.certificates # NGINX main configuration file through template j2_env = Environment(loader=FileSystemLoader(NcgConfig.config['templates']['root_dir'] + '/' + apiversion), @@ -172,16 +172,16 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo nginxMainConf = j2_env.get_template(NcgConfig.config['templates']['nginxmain']).render( nginxconf={'mainhttpfile': NcgConfig.config['nms']['staged_config_http_filename'], 'mainstreamfile': NcgConfig.config['nms']['staged_config_stream_filename'], - 'modules': v5_4.MiscUtils.getDictKey(d, 'output.nginxone.modules'), - 'license': v5_4.MiscUtils.getDictKey(d, 'output.license')}, - d={'http': v5_4.MiscUtils.getDictKey(d, 'declaration.http')}) + 'modules': v5_6.MiscUtils.getDictKey(d, 'output.nginxone.modules'), + 'license': v5_6.MiscUtils.getDictKey(d, 'output.license')}, + d={'http': v5_6.MiscUtils.getDictKey(d, 'declaration.http')}) # Base64-encoded NGINX main configuration (/etc/nginx/nginx.conf) b64NginxMain = str(base64.urlsafe_b64encode(nginxMainConf.encode("utf-8")), "utf-8") # NGINX License file licenseJwtFile = j2_env.get_template(NcgConfig.config['templates']['license']).render( - nginxconf={'license': v5_4.MiscUtils.getDictKey(d, 'output.license')}) + nginxconf={'license': v5_6.MiscUtils.getDictKey(d, 'output.license')}) # Base64-encoded license file (/etc/nginx/license.jwt) b64licenseJwtFile = str(base64.urlsafe_b64encode(licenseJwtFile.encode("utf-8")), "utf-8") @@ -213,7 +213,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo # If no R33+ license token was specified in the JSON declaration, it is assumed a token already exists # on the NGINX instances and it won't be overwritten - if v5_4.MiscUtils.getDictKey(d, 'output.license.token') != "": + if v5_6.MiscUtils.getDictKey(d, 'output.license.token') != "": configFiles['files'].append(filesLicenseFile) # Staged config @@ -235,7 +235,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo f'Declaration [{configUid}] changed, publishing' if configUid else f'New declaration created, publishing') # Get the config sync group id nOneUrl: str, nOneTokenUsername: str, nameSpace: str, clusterName: str - returnCode, igUid = v5_4.NGINXOneUtils.getConfigSyncGroupId(nOneUrl = nOneUrl, nOneToken = nOneToken, + returnCode, igUid = v5_6.NGINXOneUtils.getConfigSyncGroupId(nOneUrl = nOneUrl, nOneToken = nOneToken, nameSpace = nOneNamespace, configSyncGroupName = nOneConfigSyncGroup) # Invalid config sync group @@ -248,7 +248,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo ### NGINX App Protect policies support - commits policies to control plane # Check NGINX App Protect WAF policies configuration sanity - status, description = v5_4.NGINXOneNAPUtils.checkDeclarationPolicies(d) + status, description = v5_6.NGINXOneNAPUtils.checkDeclarationPolicies(d) if status != 200: return {"status_code": 422, @@ -256,12 +256,12 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo "headers": {'Content-Type': 'application/json'}} # Provision NGINX App Protect WAF policies to NGINX Instance Manager - ppReply = v5_4.NGINXOneNAPUtils.provisionPolicies( + ppReply = v5_6.NGINXOneNAPUtils.provisionPolicies( nginxOneUrl = nOneUrl, nginxOneToken = nOneToken, nginxOneNamespace = nOneNamespace, declaration=d) if ppReply.status_code >= 400: return {"status_code": ppReply.status_code, - "message": {"status_code": ppReply.status_code, "message": {"code": ppReply.status_code, "content": ppReply.content} }} + "message": {"status_code": ppReply.status_code, "message": {"code": ppReply.status_code, "content": json.loads(ppReply.body)['details']} }} napPolicies = json.loads(ppReply.body) provisionedNapPolicies = napPolicies['all_policy_names_and_versions'] @@ -317,7 +317,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo # if nmsSynctime > 0 and runfromautosync == False: if runfromautosync == False: # No configuration is found, generate one - configUid = str(v5_4.MiscUtils.getuniqueid()) + configUid = str(v5_6.MiscUtils.getuniqueid()) # Stores the staged config to redis # Redis keys: @@ -333,7 +333,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo NcgRedis.redis.set(f'ncg.apiversion.{configUid}', apiversion) # Makes NGINX App Protect policies active - doWeHavePolicies = v5_4.NGINXOneNAPUtils.makePolicyActive(nginxOneUrl=nOneUrl, + doWeHavePolicies = v5_6.NGINXOneNAPUtils.makePolicyActive(nginxOneUrl=nOneUrl, nginxOneToken=nOneToken, nginxOneNamespace=nOneNamespace, activePolicyUids=activePolicyUids, @@ -343,7 +343,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo # Clean up NGINX App Protect WAF policies not used anymore # and not defined in the declaration just pushed time.sleep(NcgConfig.config['nms']['staged_config_publish_waittime']) - #v5_4.NGINXOneNAPUtils.cleanPolicyLeftovers(nginxOneUrl=nOneUrl,nginxOneToken=nOneToken, + #v5_6.NGINXOneNAPUtils.cleanPolicyLeftovers(nginxOneUrl=nOneUrl,nginxOneToken=nOneToken, # nginxOneNamespace=nOneNamespace, # currentPolicies=provisionedNapPolicies) @@ -354,7 +354,7 @@ def NGINXOneOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpCo # GitOps autosync print(f'Starting autosync for configUid {configUid} every {nOneSynctime} seconds') - job = schedule.every(nOneSynctime).seconds.do(lambda: v5_4_CreateConfig.configautosync(configUid)) + job = schedule.every(nOneSynctime).seconds.do(lambda: v5_6_CreateConfig.configautosync(configUid)) # Keep track of GitOps configs, key is the threaded job NcgRedis.declarationsList[configUid] = job diff --git a/src/v5_4/NGINXOneUtils.py b/src/v5_6/NGINXOneUtils.py similarity index 100% rename from src/v5_4/NGINXOneUtils.py rename to src/v5_6/NGINXOneUtils.py diff --git a/src/v5_4/NIMNAPUtils.py b/src/v5_6/NIMNAPUtils.py similarity index 68% rename from src/v5_4/NIMNAPUtils.py rename to src/v5_6/NIMNAPUtils.py index eee72cc3..4971ee00 100644 --- a/src/v5_4/NIMNAPUtils.py +++ b/src/v5_6/NIMNAPUtils.py @@ -1,12 +1,12 @@ """ -NGINX App Protect support functions +F5 WAF for NGINX support functions """ import requests import json import base64 -import v5_4.GitOps +import v5_6.GitOps from NcgConfig import NcgConfig @@ -15,13 +15,13 @@ available_log_profiles = ['log_all', 'log_blocked', 'log_illegal', 'secops_dashboard'] -# Define (create/update) a NGINX App Protect policy on NMS. -# If policyUid is not empty a the policy update is performed +# Define (create/update) a F5 WAF for NGINX policy on NMS. +# If policyUid is not empty the policy update is performed # Returns a tuple {status_code,text}. status_code is 201 if successful def __definePolicyOnNMS__(nmsUrl: str, nmsUsername: str, nmsPassword: str, policyName: str, policyDisplayName: str, policyDescription: str, policyJson: str, policyUid: str = ""): # policyJson holds the base64-encoded policy JSON definition - # Control plane-compiled policy bundles are supported. Create the NGINX App Protect policy on NGINX Instance Manager + # Control plane-compiled policy bundles are supported. Create the F5 WAF for NGINX policy on NGINX Instance Manager # POST https://IP_ADDRESS/api/platform/v1/security/policies # { # "metadata": { @@ -80,20 +80,23 @@ def __deletePolicy__(nmsUrl: str, nmsUsername: str, nmsPassword: str, policyUid: # Check NAP policies names validity for the given declaration # Return a tuple: status, description. If status = 200 checks were successful def checkDeclarationPolicies(declaration: dict): - # NGINX App Protect policies check - duplicated policy names + # F5 WAF for NGINX policies check - duplicated policy names # all policy names as defined in the declaration # { 'policyName': 'activeTag', ... } allPolicyNames = {} - if 'policies' not in declaration['output']['nms']: + if 'http' not in declaration['declaration']: return 200, "" - for policy in declaration['output']['nms']['policies']: + if 'policies' not in declaration['declaration']['http']: + return 200, "" + + for policy in declaration['declaration']['http']['policies']: # print(f"Found NAP Policy [{policy['name']}] active tag [{policy['active_tag']}]") if policy['name'] and policy['name'] in allPolicyNames: - return 422, f"Duplicated NGINX App Protect WAF policy [{policy['name']}]" + return 422, f"Duplicated F5 WAF for NGINX WAF policy [{policy['name']}]" allPolicyNames[policy['name']] = policy['active_tag'] @@ -101,7 +104,7 @@ def checkDeclarationPolicies(declaration: dict): allPolicyVersionTags = {} for policyVersion in policy['versions']: if policyVersion['tag'] and policyVersion['tag'] in allPolicyVersionTags: - return 422, f"Duplicated NGINX App Protect WAF policy tag [{policyVersion['tag']}] " \ + return 422, f"Duplicated F5 WAF for NGINX WAF policy tag [{policyVersion['tag']}] " \ f"for policy [{policy['name']}]" allPolicyVersionTags[policyVersion['tag']] = "found" @@ -115,42 +118,44 @@ def checkDeclarationPolicies(declaration: dict): if 'app_protect' in httpServer: if 'policy' in httpServer['app_protect'] and httpServer['app_protect']['policy'] \ and httpServer['app_protect']['policy'] not in allPolicyNames: - return 422, f"Unknown NGINX App Protect WAF policy [{httpServer['app_protect']['policy']}] " \ - f"referenced by HTTP server [{httpServer['name']}]" + return 422, f"Unknown F5 WAF for NGINX WAF policy [{httpServer['app_protect']['policy']}] " \ + f"referenced by HTTP server [{httpServer['name']}] it should be one of [{', '.join(allPolicyNames.keys())}]" if 'log' in httpServer['app_protect'] \ and 'profile_name' in httpServer['app_protect']['log'] \ and httpServer['app_protect']['log']['profile_name'] \ and httpServer['app_protect']['log']['profile_name'] \ not in available_log_profiles: - return 422, f"Invalid NGINX App Protect WAF log profile " \ + return 422, f"Invalid F5 WAF for NGINX WAF log profile " \ f"[{httpServer['app_protect']['log']['profile_name']}] referenced by HTTP server " \ - f"[{httpServer['name']}]" + f"[{httpServer['name']}] it should be one of [{', '.join(available_log_profiles.keys())}]" # Check policy names referenced in HTTP servers[].locations[] for location in httpServer['locations']: if 'app_protect' in location: if 'policy' in location['app_protect'] and location['app_protect']['policy'] \ and location['app_protect']['policy'] not in allPolicyNames: - return 422, f"Unknown NGINX App Protect WAF policy [{location['app_protect']['policy']}] " \ - f"referenced by HTTP server [{httpServer['name']}] location [{location['uri']}]" + return 422, f"Unknown F5 WAF for NGINX WAF policy [{location['app_protect']['policy']}] " \ + (f"referenced by HTTP server [{httpServer['name']}] location [{location['uri']}] " + f"it should be one of [{', '.join(allPolicyNames.keys())}]") if 'log' in httpServer['app_protect'] and httpServer['app_protect']['log'] \ and httpServer['app_protect']['log']['profile_name'] \ and httpServer['app_protect']['log']['profile_name'] \ not in available_log_profiles: - return 422, f"Invalid NGINX App Protect WAF log profile " \ + return 422, f"Invalid F5 WAF for NGINX WAF log profile " \ f"[{httpServer['app_protect']['log']['profile_name']}] referenced by HTTP server " \ - f"[{httpServer['name']}] location [{location['uri']}]" + (f"[{httpServer['name']}] location [{location['uri']}] " + f"it should be one of [{', '.join(available_log_profiles.keys())}]") return 200, "" -# For the given declaration creates/updates NGINX App Protect WAF policies on NGINX Instance Manager +# For the given declaration creates/updates F5 WAF for NGINX WAF policies on NGINX Instance Manager # making sure that they are in sync with what is defined in the JSON declaration # Returns a JSON with status code and content def provisionPolicies(nmsUrl: str, nmsUsername: str, nmsPassword: str, declaration: dict): - # NGINX App Protect policies - each policy supports multiple tagged versions + # F5 WAF for NGINX policies - each policy supports multiple tagged versions # Policy names and all tag/uid pairs # {'prod-policy': [{'tag': 'v1', 'uid': 'ebcf9c7e-0930-450d-8108-7cad30e59661'}, @@ -164,58 +169,59 @@ def provisionPolicies(nmsUrl: str, nmsUsername: str, nmsPassword: str, declarati # 'staging-policy': '7b4b850a-ff9e-42a0-85d0-850171474224' } all_policy_active_names_and_uids = {} - for p in declaration['output']['nms']['policies']: - policy_name = p['name'] - if policy_name: - policy_active_tag = p['active_tag'] - - # Iterates over all NGINX App Protect policies - if p['type'] == 'app_protect': - # Iterates over all policy versions - for policyVersion in p['versions']: - status, policyBody = v5_4.GitOps.getObjectFromRepo(policyVersion['contents']) - - if status != 200: - return JSONResponse( - status_code=422, - content={"code": status, - "details": policyBody['content']} + if 'http' in declaration['declaration'] and 'policies' in declaration['declaration']['http']: + for p in declaration['declaration']['http']['policies']: + policy_name = p['name'] + if policy_name: + policy_active_tag = p['active_tag'] + + # Iterates over all F5 WAF for NGINX policies + if p['type'] == 'app_protect': + # Iterates over all policy versions + for policyVersion in p['versions']: + status, policyBody = v5_6.GitOps.getObjectFromRepo(policyVersion['contents']) + + if status != 200: + return JSONResponse( + status_code=422, + content={"code": status, + "details": policyBody['content']} + ) + + # Create the F5 WAF for NGINX policy on NMS + r = __definePolicyOnNMS__( + nmsUrl=nmsUrl, nmsUsername=nmsUsername, nmsPassword=nmsPassword, + policyName=policy_name, + policyDisplayName=policyVersion['displayName'], + policyDescription=policyVersion['description'], + policyJson=policyBody['content'] ) - # Create the NGINX App Protect policy on NMS - r = __definePolicyOnNMS__( - nmsUrl=nmsUrl, nmsUsername=nmsUsername, nmsPassword=nmsPassword, - policyName=policy_name, - policyDisplayName=policyVersion['displayName'], - policyDescription=policyVersion['description'], - policyJson=policyBody['content'] - ) - - # Check for errors creating NGINX App Protect policy - if r.status_code != 201: - return JSONResponse( - status_code=r.status_code, - content={"code": r.status_code, "details": json.loads(r.text)} - ) - else: - # Policy was created, retrieve metadata.uid for each policy version - if policy_name not in all_policy_names_and_versions: - all_policy_names_and_versions[policy_name] = [] + # Check for errors creating F5 WAF for NGINX policy + if r.status_code != 201: + return JSONResponse( + status_code=r.status_code, + content={"code": r.status_code, "details": json.loads(r.text)} + ) + else: + # Policy was created, retrieve metadata.uid for each policy version + if policy_name not in all_policy_names_and_versions: + all_policy_names_and_versions[policy_name] = [] - # Stores the policy version - uid = json.loads(r.text)['metadata']['uid'] - tag = policyVersion['tag'] + # Stores the policy version + uid = json.loads(r.text)['metadata']['uid'] + tag = policyVersion['tag'] - if policy_active_tag == tag: - all_policy_active_names_and_uids[policy_name] = uid + if policy_active_tag == tag: + all_policy_active_names_and_uids[policy_name] = uid - all_policy_names_and_versions[policy_name].append({'tag': tag, 'uid': uid}) + all_policy_names_and_versions[policy_name].append({'tag': tag, 'uid': uid}) return JSONResponse(status_code=200, content={"all_policy_names_and_versions": all_policy_names_and_versions, "all_policy_active_names_and_uids": all_policy_active_names_and_uids}) -# Publish a NGINX App Protect WAF policy making it active +# Publish a F5 WAF for NGINX WAF policy making it active # activePolicyUids is a dict { "policy_name": "active_uid", [...] } # Return True if at least one policy was enabled, False otherwise def makePolicyActive(nmsUrl: str, nmsUsername: str, nmsPassword: str, activePolicyUids: dict, instanceGroupUid: str): @@ -243,7 +249,7 @@ def makePolicyActive(nmsUrl: str, nmsUsername: str, nmsPassword: str, activePoli return doWeHavePolicies -# For the given declaration creates/updates NGINX App Protect WAF policies on NGINX Instance Manager +# For the given declaration creates/updates F5 WAF for NGINX WAF policies on NGINX Instance Manager # making sure that they are in sync with what is defined in the JSON declaration # Returns a tuple: status, response payload def cleanPolicyLeftovers(nmsUrl: str, nmsUsername: str, nmsPassword: str, currentPolicies: dict): diff --git a/src/v5_4/NIMOutput.py b/src/v5_6/NIMOutput.py similarity index 80% rename from src/v5_4/NIMOutput.py rename to src/v5_6/NIMOutput.py index 20a0b8d7..add649f5 100644 --- a/src/v5_4/NIMOutput.py +++ b/src/v5_6/NIMOutput.py @@ -13,21 +13,21 @@ from urllib.parse import urlparse from datetime import datetime -import V5_4_CreateConfig +import V5_6_CreateConfig -import v5_4.APIGateway -import v5_4.DevPortal -import v5_4.DeclarationPatcher -import v5_4.GitOps -import v5_4.MiscUtils -import v5_4.NIMOutput -import v5_4.NIMUtils +import v5_6.APIGateway +import v5_6.DevPortal +import v5_6.DeclarationPatcher +import v5_6.GitOps +import v5_6.MiscUtils +import v5_6.NIMOutput +import v5_6.NIMUtils # pydantic models -from V5_4_NginxConfigDeclaration import * +from V5_6_NginxConfigDeclaration import * -# NGINX App Protect helper functions -import v5_4.NIMNAPUtils +# F5 WAF for NGINX helper functions +import v5_6.NIMNAPUtils # NGINX Declarative API modules from NcgConfig import NcgConfig @@ -39,12 +39,12 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s configUid: str = ""): # NGINX Instance Manager Staged Configuration publish - nmsUsername = v5_4.MiscUtils.getDictKey(d, 'output.nms.username') - nmsPassword = v5_4.MiscUtils.getDictKey(d, 'output.nms.password') - nmsInstanceGroup = v5_4.MiscUtils.getDictKey(d, 'output.nms.instancegroup') - nmsSynctime = v5_4.MiscUtils.getDictKey(d, 'output.nms.synctime') + nmsUsername = v5_6.MiscUtils.getDictKey(d, 'output.nms.username') + nmsPassword = v5_6.MiscUtils.getDictKey(d, 'output.nms.password') + nmsInstanceGroup = v5_6.MiscUtils.getDictKey(d, 'output.nms.instancegroup') + nmsSynctime = v5_6.MiscUtils.getDictKey(d, 'output.nms.synctime') - nmsUrlFromJson = v5_4.MiscUtils.getDictKey(d, 'output.nms.url') + nmsUrlFromJson = v5_6.MiscUtils.getDictKey(d, 'output.nms.url') urlCheck = urlparse(nmsUrlFromJson) if urlCheck.scheme not in ['http', 'https'] or urlCheck.scheme == "" or urlCheck.netloc == "": @@ -54,7 +54,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s "headers": {'Content-Type': 'application/json'}} # DNS resolution check - dnsOutcome, dnsReply = v5_4.MiscUtils.resolveFQDN(urlCheck.netloc) + dnsOutcome, dnsReply = v5_6.MiscUtils.resolveFQDN(urlCheck.netloc) if not dnsOutcome: return {"status_code": 400, "message": {"status_code": 400, "message": {"code": 400, @@ -68,13 +68,13 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s "message": {"status_code": 400, "message": {"code": 400, "content": "synctime must be >= 0"}}, "headers": {'Content-Type': 'application/json'}} - # Fetch NGINX App Protect WAF policies from source of truth if needed - d_policies = v5_4.MiscUtils.getDictKey(d, 'output.nms.policies') + # Fetch F5 WAF for NGINX WAF policies from source of truth if needed + d_policies = v5_6.MiscUtils.getDictKey(d, 'output.declaration.http.policies') if d_policies is not None: for policy in d_policies: if 'versions' in policy: for policyVersion in policy['versions']: - status, content = v5_4.GitOps.getObjectFromRepo(object=policyVersion['contents'], + status, content = v5_6.GitOps.getObjectFromRepo(object=policyVersion['contents'], authProfiles=d['declaration']['http'][ 'authentication']) @@ -86,19 +86,19 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s # Check TLS items validity all_tls = {'certificate': {}, 'key': {}} - d_certs = v5_4.MiscUtils.getDictKey(d, 'output.nms.certificates') + d_certs = v5_6.MiscUtils.getDictKey(d, 'declaration.certificates') if d_certs is not None: for i in range(len(d_certs)): if d_certs[i]['name']: all_tls[d_certs[i]['type']][d_certs[i]['name']] = True # TLS certificates and key names validity checks for servers - d_servers = v5_4.MiscUtils.getDictKey(d, 'declaration.http.servers') + d_servers = v5_6.MiscUtils.getDictKey(d, 'declaration.http.servers') if d_servers is not None: for server in d_servers: if server['listen'] is not None: if 'tls' in server['listen']: - cert_name = v5_4.MiscUtils.getDictKey(server, 'listen.tls.certificate') + cert_name = v5_6.MiscUtils.getDictKey(server, 'listen.tls.certificate') if cert_name and cert_name not in all_tls['certificate']: return {"status_code": 422, "message": { @@ -109,7 +109,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s server['names']) + "] must be one of [" + ",".join(all_tls['certificate']) + "]"} }} - cert_key = v5_4.MiscUtils.getDictKey(server, 'listen.tls.key') + cert_key = v5_6.MiscUtils.getDictKey(server, 'listen.tls.key') if cert_key and cert_key not in all_tls['key']: return {"status_code": 422, "message": { @@ -119,7 +119,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s server['names']) + "] must be one of [" + ",".join(all_tls['key']) + "]"} }} - trusted_cert_name = v5_4.MiscUtils.getDictKey(server, 'listen.tls.trusted_ca_certificates') + trusted_cert_name = v5_6.MiscUtils.getDictKey(server, 'listen.tls.trusted_ca_certificates') if trusted_cert_name and trusted_cert_name not in all_tls['certificate']: return {"status_code": 422, "message": { @@ -131,7 +131,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s }} # TLS certificates and key names validity checks or ACME issuer profiles - d_acmeissuers = v5_4.MiscUtils.getDictKey(d, 'declaration.http.acme_issuers') + d_acmeissuers = v5_6.MiscUtils.getDictKey(d, 'declaration.http.acme_issuers') if d_acmeissuers is not None: for issuer in d_acmeissuers: cert_name = issuer['ssl_trusted_certificate'] @@ -145,13 +145,13 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s issuer['name']) +"] must be one of [" + ",".join(all_tls['certificate']) + "]"} }} - # Add optional certificates specified under output.nms.certificates + # Add optional certificates specified under declaration.certificates extensions_map = {'certificate': '.crt', 'key': '.key'} - d_certificates = v5_4.MiscUtils.getDictKey(d, 'output.nms.certificates') + d_certificates = v5_6.MiscUtils.getDictKey(d, 'declaration.certificates') if d_certificates is not None: for c in d_certificates: - status, certContent = v5_4.GitOps.getObjectFromRepo(object=c['contents'], + status, certContent = v5_6.GitOps.getObjectFromRepo(object=c['contents'], authProfiles=d['declaration']['http']['authentication']) if status != 200: @@ -162,7 +162,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s '/' + c['name'] + extensions_map[c['type']]} auxFiles['files'].append(newAuxFile) - ### / Add optional certificates specified under output.nms.certificates + ### / Add optional certificates specified under declaration.certificates # NGINX main configuration file through template j2_env = Environment(loader=FileSystemLoader(NcgConfig.config['templates']['root_dir'] + '/' + apiversion), @@ -171,16 +171,16 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s nginxMainConf = j2_env.get_template(NcgConfig.config['templates']['nginxmain']).render( nginxconf={'mainhttpfile': NcgConfig.config['nms']['staged_config_http_filename'], 'mainstreamfile': NcgConfig.config['nms']['staged_config_stream_filename'], - 'modules': v5_4.MiscUtils.getDictKey(d, 'output.nms.modules'), - 'license': v5_4.MiscUtils.getDictKey(d, 'output.license')}, - d={'http': v5_4.MiscUtils.getDictKey(d, 'declaration.http')}) + 'modules': v5_6.MiscUtils.getDictKey(d, 'output.nms.modules'), + 'license': v5_6.MiscUtils.getDictKey(d, 'output.license')}, + d={'http': v5_6.MiscUtils.getDictKey(d, 'declaration.http')}) # Base64-encoded NGINX main configuration (/etc/nginx/nginx.conf) b64NginxMain = str(base64.urlsafe_b64encode(nginxMainConf.encode("utf-8")), "utf-8") # NGINX License file licenseJwtFile = j2_env.get_template(NcgConfig.config['templates']['license']).render( - nginxconf={'license': v5_4.MiscUtils.getDictKey(d, 'output.license')}) + nginxconf={'license': v5_6.MiscUtils.getDictKey(d, 'output.license')}) # Base64-encoded license file (/etc/nginx/license.jwt) b64licenseJwtFile = str(base64.urlsafe_b64encode(licenseJwtFile.encode("utf-8")), "utf-8") @@ -212,7 +212,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s # If no R33+ license token was specified in the JSON declaration, it is assumed a token already exists # on the NGINX instances and it won't be overwritten - if v5_4.MiscUtils.getDictKey(d, 'output.license.token') != "": + if v5_6.MiscUtils.getDictKey(d, 'output.license.token') != "": configFiles['files'].append(filesLicenseFile) # Staged config @@ -235,7 +235,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s f'Declaration [{configUid}] changed, publishing' if configUid else f'New declaration created, publishing') # Get the instance group id - igUid = v5_4.NIMUtils.getNIMInstanceGroupUid(nmsUrl=nmsUrl, nmsUsername=nmsUsername, + igUid = v5_6.NIMUtils.getNIMInstanceGroupUid(nmsUrl=nmsUrl, nmsUsername=nmsUsername, nmsPassword=nmsPassword, instanceGroupName=nmsInstanceGroup) # Invalid instance group @@ -245,29 +245,29 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s "content": f"instance group {nmsInstanceGroup} not found"}}, "headers": {'Content-Type': 'application/json'}} - ### NGINX App Protect policies support - commits policies to control plane + ### F5 WAF for NGINX policies support - commits policies to control plane - # Check NGINX App Protect WAF policies configuration sanity - status, description = v5_4.NIMNAPUtils.checkDeclarationPolicies(d) + # Check WAF policies configuration sanity + status, description = v5_6.NIMNAPUtils.checkDeclarationPolicies(d) if status != 200: return {"status_code": 422, "message": {"status_code": status, "message": {"code": status, "content": description}}, "headers": {'Content-Type': 'application/json'}} - # Provision NGINX App Protect WAF policies to NGINX Instance Manager - ppReply = v5_4.NIMNAPUtils.provisionPolicies( + # Provision WAF policies to NGINX Instance Manager + ppReply = v5_6.NIMNAPUtils.provisionPolicies( nmsUrl=nmsUrl, nmsUsername=nmsUsername, nmsPassword=nmsPassword, declaration=d) if ppReply.status_code >= 400: return {"status_code": ppReply.status_code, - "message": {"status_code": ppReply.status_code, "message": {"code": ppReply.status_code, "content": ppReply} }} + "message": {"status_code": ppReply.status_code, "message": {"code": ppReply.status_code, "content": json.loads(ppReply.body)['details']} }} napPolicies = json.loads(ppReply.body) provisionedNapPolicies = napPolicies['all_policy_names_and_versions'] activePolicyUids = napPolicies['all_policy_active_names_and_uids'] - ### / NGINX App Protect policies support + ### / F5 WAF for NGINX policies support ### Publish staged config to instance group r = requests.post(url=nmsUrl + f"/api/platform/v1/instance-groups/{igUid}/config", @@ -285,8 +285,9 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s # Fetch the deployment status publishResponse = json.loads(r.text) - # Wait for either NIM success or failure after pushing a staged config + # Wait for either NGINX Instance Manager success or failure after pushing a staged config isPending = True + jsonResponse = {} while isPending: time.sleep(NcgConfig.config['nms']['staged_config_publish_waittime']) deploymentCheck = requests.get(url=nmsUrl + publishResponse['links']['rel'], @@ -295,12 +296,16 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s checkJson = json.loads(deploymentCheck.text) - if not checkJson['details']['pending']: + if deploymentCheck.status_code == 404: + jsonResponse = {"message": f"deployment not found at {publishResponse['links']['rel']}"} isPending = False - if len(checkJson['details']['failure']) > 0: + if 'details' in checkJson and not checkJson['details']['pending']: + isPending = False + + if 'details' not in checkJson or len(checkJson['details']['failure']) > 0: # Staged config publish to NIM failed - jsonResponse = checkJson['details']['failure'][0] + jsonResponse = checkJson['details']['failure'][0] if 'details' in checkJson else jsonResponse deploymentCheck.status_code = 422 else: # Staged config publish to NIM succeeded @@ -309,7 +314,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s # if nmsSynctime > 0 and runfromautosync == False: if runfromautosync == False: # No configuration is found, generate one - configUid = str(v5_4.MiscUtils.getuniqueid()) + configUid = str(v5_6.MiscUtils.getuniqueid()) # Stores the staged config to redis # Redis keys: @@ -324,19 +329,19 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s NcgRedis.redis.set(f'ncg.basestagedconfig.{configUid}', json.dumps(baseStagedConfig)) NcgRedis.redis.set(f'ncg.apiversion.{configUid}', apiversion) - # Makes NGINX App Protect policies active - doWeHavePolicies = v5_4.NIMNAPUtils.makePolicyActive(nmsUrl=nmsUrl, nmsUsername=nmsUsername, - nmsPassword=nmsPassword, - activePolicyUids=activePolicyUids, - instanceGroupUid=igUid) + # Makes F5 WAF for NGINX policies active + doWeHavePolicies = v5_6.NIMNAPUtils.makePolicyActive(nmsUrl=nmsUrl, nmsUsername=nmsUsername, + nmsPassword=nmsPassword, + activePolicyUids=activePolicyUids, + instanceGroupUid=igUid) if doWeHavePolicies: - # Clean up NGINX App Protect WAF policies not used anymore + # Clean up F5 WAF for NGINX WAF policies not used anymore # and not defined in the declaration just pushed time.sleep(NcgConfig.config['nms']['staged_config_publish_waittime']) - v5_4.NIMNAPUtils.cleanPolicyLeftovers(nmsUrl=nmsUrl, nmsUsername=nmsUsername, - nmsPassword=nmsPassword, - currentPolicies=provisionedNapPolicies) + v5_6.NIMNAPUtils.cleanPolicyLeftovers(nmsUrl=nmsUrl, nmsUsername=nmsUsername, + nmsPassword=nmsPassword, + currentPolicies=provisionedNapPolicies) # If deploying a new configuration in GitOps mode start autosync if nmsSynctime == 0: @@ -345,7 +350,7 @@ def NIMOutput(d, declaration: ConfigDeclaration, apiversion: str, b64HttpConf: s # GitOps autosync print(f'Starting autosync for configUid {configUid} every {nmsSynctime} seconds') - job = schedule.every(nmsSynctime).seconds.do(lambda: v5_4_CreateConfig.configautosync(configUid)) + job = schedule.every(nmsSynctime).seconds.do(lambda: v5_6_CreateConfig.configautosync(configUid)) # Keep track of GitOps configs, key is the threaded job NcgRedis.declarationsList[configUid] = job diff --git a/src/v5_4/NIMUtils.py b/src/v5_6/NIMUtils.py similarity index 92% rename from src/v5_4/NIMUtils.py rename to src/v5_6/NIMUtils.py index de1b9a96..aade4dfe 100644 --- a/src/v5_4/NIMUtils.py +++ b/src/v5_6/NIMUtils.py @@ -10,7 +10,7 @@ # Return None if not found def getNIMInstanceGroupUid(nmsUrl: str, nmsUsername: str, nmsPassword: str, instanceGroupName: str): # Retrieve instance group uid - ig = requests.get(url=f'{nmsUrl}/api/platform/v1/instance-groups', auth=(nmsUsername, nmsPassword), + ig = requests.get(url=f'{nmsUrl}/api/platform/v1/instance-groups?limit=100', auth=(nmsUsername, nmsPassword), verify=False) if ig.status_code != 200: diff --git a/src/v5_6/OpenAPIParser.py b/src/v5_6/OpenAPIParser.py new file mode 100644 index 00000000..5e415563 --- /dev/null +++ b/src/v5_6/OpenAPIParser.py @@ -0,0 +1,102 @@ +""" +OpenAPI schema parser support functions +""" + +import json + +class OpenAPIParser: + httpMethods = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'] + + def __init__(self, openAPISchema): + self.openAPISchema = openAPISchema + + def version(self): + if 'openapi' in self.openAPISchema: + return self.openAPISchema['openapi'] + elif 'swagger' in self.openAPISchema: + return self.openAPISchema['swagger'] + + return None + + def info(self): + if 'info' in self.openAPISchema: + return self.openAPISchema['info'] + + return None + + def servers(self): + self.allServers = [] + + # Loop over OpenAPI schema servers + if 'servers' in self.openAPISchema: + for server in self.openAPISchema['servers']: + urlName = server['url'] + self.s = {} + self.s['url'] = urlName + + if 'description' in server: + self.s['description'] = server['description'] + + self.allServers.append(self.s) + + return self.allServers + + def paths(self): + self.allPaths = [] + + # Loop over OpenAPI schema paths + if 'paths' in self.openAPISchema: + for path in self.openAPISchema['paths'].keys(): + #print(f"- {path}") + self.p = {} + self.p['path'] = path + self.p['methods'] = [] + + # Loop over path HTTP methods found in schema + for method in self.openAPISchema['paths'][path].keys(): + methodInfo = self.openAPISchema['paths'][path][method] + + if method.upper() in self.httpMethods: + self.m = {} + self.m['method'] = method + self.m['details'] = {} + self.m['parameters'] = [] + + self.m['details']['description'] = methodInfo['description'] if 'description' in methodInfo else '' + self.m['details']['summary'] = methodInfo['summary'] if 'summary' in methodInfo else '' + self.m['details']['operationId'] = methodInfo['operationId'] if 'operationId' in methodInfo else '' + + # loop over query string parameters + if 'parameters' in methodInfo and methodInfo['parameters']: + parametersInfo = methodInfo['parameters'] + for qsParam in parametersInfo: + if 'name' in qsParam: + thisParam = {} + thisParam['name'] = qsParam['name'] + thisParam['in'] = qsParam['in'] if 'in' in qsParam else '' + thisParam['description'] = qsParam['description'] if 'description' in qsParam else '' + thisParam['required'] = qsParam[ + 'required'] if 'required' in qsParam else False + # thisParam['type'] = qsParam['type'] if 'type' in qsParam else '' + thisParamSchema = {} + + if 'schema' in qsParam: + thisParamSchema['type'] = qsParam['schema']['type'] if 'type' in qsParam['schema'] else '' + thisParamSchema['default'] = qsParam['schema']['default'] if 'default' in qsParam['schema'] else '' + + thisParamSchemaEnum = [] + if 'enum' in qsParam['schema']: + for e in qsParam['schema']['enum']: + thisParamSchemaEnum.append(e) + + thisParamSchema['enum'] = thisParamSchemaEnum + + thisParam['schema'] = thisParamSchema + + self.m['parameters'].append(thisParam) + + self.p['methods'].append(self.m) + + self.allPaths.append(self.p) + + return self.allPaths diff --git a/templates/v5.6/apigateway-maps.tmpl b/templates/v5.6/apigateway-maps.tmpl new file mode 100644 index 00000000..23790689 --- /dev/null +++ b/templates/v5.6/apigateway-maps.tmpl @@ -0,0 +1,72 @@ +# API Gateway maps file - server {{ server }} +# OpenAPI version: {{ declaration.version }} +# Base URI: {{ declaration.location.uri }} +# Strip base URI: {{ declaration.location.apigateway.api_gateway.strip_uri }} + +{%- for path in declaration.paths -%} +{%- for method in path.methods %} +{%- set queryStringParms = namespace(allParams = '') %} +{%- for parm in method.parameters -%} +{%- if parm.required | lower == "true" and parm.in | lower == "query" %} +{%- set queryStringParms.allParams = queryStringParms.allParams + ' ' + parm.name %} +{%- endif %} +{%- endfor -%} + + +{% if queryStringParms.allParams != '' %} + + +# Required query string parameters for {{ declaration.location.uri }}{{ path.path }} - method {{ method.method|upper }} +map "" $required_params_{{ method.method }}_{{ server | replace('.','_') }}{{ declaration.location.uri | replace('/','_') }}{{ path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') }} { + default "{{ queryStringParms.allParams | trim }}"; +} +{%- endif -%} + +{% set allParams = namespace(missing = '') -%} +{% set allParamsValues = namespace(missing = '') -%} +{% for parm in method.parameters -%} +{% if parm.required | lower == "true" and parm.in|lower == "query" %} + +{% set allParams.missing = allParams.missing + "$missing_" + method.method + "_" + server | replace('.','_') + declaration.location.uri | replace('/','_') + path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') + "_" + parm.name %} + +# Check query string parameter value and set variable to 0 if the value is among allowed ones in the OpenAPI schema enum, 1 if value is wrong +{% if parm.schema.enum %} +map $request_method$host$uri-$arg_{{ parm.name }} $wrongvalue_{{ method.method }}_{{ server | replace('.','_') }}{{ declaration.location.uri | replace('/','_') }}{{ path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') }}_{{ parm.name }} +{ +{% for enum in parm.schema.enum %} + "{{ method.method|upper }}{{ server }}{{ declaration.location.uri }}{{ path.path }}-{{ enum }}" 0; +{% set allParamsValues.missing = allParamsValues.missing + "$wrongvalue_" + method.method + "_" + server | replace('.','_') + declaration.location.uri | replace('/','_') + path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') + "_" + parm.name + "-" + enum %} +{% endfor %} + default 1; +} +{% endif %} + +# Check query string parameters and set variable to 0 if found, 1 if missing +map $request_method$host$uri$arg_{{ parm.name }} $missing_{{ method.method }}_{{ server | replace('.','_') }}{{ declaration.location.uri | replace('/','_') }}{{ path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') }}_{{ parm.name }} +{ + "{{ method.method|upper }}{{ server }}{{ declaration.location.uri }}{{ path.path }}" 1; + default 0; +} +{% endif -%} +{%- endfor -%} + + +{% if allParams.missing != '' %} + +# Check if all required parameters have been received +map "{{ allParams.missing | trim }}" $any_missing_{{ method.method }}_{{ server | replace('.','_') }}{{ declaration.location.uri | replace('/','_') }}{{ path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') }} { + ~1 1; # if any digit is 1 one or more required query string parameter is missing + default 0; # all required query string parameters present +} +{% endif %} + + +# Check if all required parameter values have been received +map "{{ allParamsValues.missing | trim }}" $any_values_invalid_{{ method.method }}_{{ server | replace('.','_') }}{{ declaration.location.uri | replace('/','_') }}{{ path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') }} { +{% if allParamsValues.missing != '' %} + ~1 1; # if any digit is 1 one or more required query string parameter value is invalid +{% endif %} + default 0; # all required query string parameters have valid values +} +{%- endfor %} +{% endfor %} \ No newline at end of file diff --git a/templates/v5.4/apigateway.tmpl b/templates/v5.6/apigateway.tmpl similarity index 77% rename from templates/v5.4/apigateway.tmpl rename to templates/v5.6/apigateway.tmpl index 4a0171bd..48f016e8 100644 --- a/templates/v5.4/apigateway.tmpl +++ b/templates/v5.6/apigateway.tmpl @@ -16,10 +16,12 @@ # API Gateway: {% if declaration.info.title %}{{ declaration.info.title }}{% endif %} {% if declaration.info.version %}{{ declaration.info.version }}{% endif %} {% endif %} -# OpenAPI version: {{ declaration.version }} -# Base URI: {{ declaration.location.uri }} -# Strip base URI: {{ declaration.location.apigateway.api_gateway.strip_uri }} -# Destination server: {{ destination_server }} +# OpenAPI version: {{ declaration.version | replace('\n',' ') }} +# Base URI: {{ declaration.location.uri | replace('\n',' ') }} +# Strip base URI: {{ declaration.location.apigateway.api_gateway.strip_uri | replace('\n',' ') }} +# Destination server: {{ destination_server | replace('\n',' ') }} + +default_type application/json; {% for v in enabledVisibility %} include "{{ ncgconfig.nms.visibility_dir }}{{ declaration.location.uri }}-{{ v }}-server.conf"; @@ -27,9 +29,33 @@ include "{{ ncgconfig.nms.visibility_dir }}{{ declaration.location.uri }}-{{ v } {% if declaration.paths -%} {% for path in declaration.paths|sort(attribute='path', reverse = True) %} -location {% if '{' not in path.path %}={% else %}~{% endif %} {% if declaration.location.uri != "/" %}{{ declaration.location.uri }}{% endif %}{{ path.path | regex_replace('{(.*?)}','(.*)') }} { +location {% if '{' not in path.path %}={% else %}~{% endif %} {% if declaration.location.uri != "/" %}{{ declaration.location.uri }}{% endif %}{{ path.path | regex_replace('{(.*?)}','([^/]+)') }} { + status_zone {% if declaration.location.uri != "/" %}{{ declaration.location.uri }}{% endif %}{{ path.path | regex_replace('{(.*?)}','([^/]+)') }}; + {% for method in path.methods -%} # {{ method.method|upper }} - operationId: {{ method.details.operationId }} + {% if method.details.description %}# Description: {{ method.details.description | replace('\n',' ') }}{% endif %} + + {% if method.details.summary %}# Summary: {{ method.details.summary }}{% endif %} + + + {# --- Query String parameters enforcement --- -#} + {%- set allParams = namespace(missing = '') -%} + {% for parm in method.parameters -%} + {% if parm.required | lower == "true" and parm.in | lower == "query" %} + {% set allParams.missing = allParams.missing + "$missing_" + method.method + "_" + server | replace('.','_') + declaration.location.uri | replace('/','_') + path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') + "_" + parm.name %} + {% endif %} + {% endfor %} + + {% if allParams.missing != '' -%} + if ( $any_missing_{{ method.method }}_{{ server | replace('.','_') }}{{ declaration.location.uri | replace('/','_') }}{{ path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') }} ) { + return 422 '{"code":422,"message":"Missing required query parameter [$required_params_{{ method.method }}_{{ server | replace('.','_') }}{{ declaration.location.uri | replace('/','_') }}{{ path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') }}]"}'; + } + if ( $any_values_invalid_{{ method.method }}_{{ server | replace('.','_') }}{{ declaration.location.uri | replace('/','_') }}{{ path.path | replace('/','_') | replace('.','_') | replace('{','_') | replace('}','_') }} ) { + return 422 '{"code":422,"message":"Invalid parameter value"}'; + } + {%- endif %} + {% endfor -%} {% set method_names = path.methods|map(attribute='method')|list %} @@ -38,8 +64,10 @@ location {% if '{' not in path.path %}={% else %}~{% endif %} {% if declaration. {% if declaration.location.apigateway.log.error %}error_log {{ declaration.location.apigateway.log.error.destination }}{% if declaration.location.apigateway.log.error.level %} {{ declaration.location.apigateway.log.error.level }}{% endif %};{% endif %} + {# --- HTTP methods enforcement --- -#} limit_except {{ method_names|join(' ')|upper }} { deny all; } + {# --- Rate limiting start --- #} {%- for rl in declaration.location.apigateway.rate_limit -%} {%- set enforceRL = namespace(toBeEnforced = False) -%} @@ -158,13 +186,13 @@ location {% if '{' not in path.path %}={% else %}~{% endif %} {% if declaration. {# --- Cache end --- #} - {% if declaration.location.apigateway.api_gateway.strip_uri -%} + {%- if declaration.location.apigateway.api_gateway.strip_uri -%} rewrite ^{% if declaration.location.uri != "/" %}{{ declaration.location.uri }}{% endif %}/(.*)$ /$1 break; - {% endif %} + {%- endif %} {% if declaration.location.apigateway.api_gateway.server_url -%} proxy_set_header Host {{ declaration.location.apigateway.api_gateway.server_url.split('://')[1].split('/')[0] }}; - {% endif -%} + {%- endif %} proxy_pass {{ destination_server }}$uri$is_args$args; } diff --git a/templates/v5.4/authn/client/jwks.tmpl b/templates/v5.6/authn/client/jwks.tmpl similarity index 100% rename from templates/v5.4/authn/client/jwks.tmpl rename to templates/v5.6/authn/client/jwks.tmpl diff --git a/templates/v5.4/authn/client/jwt.tmpl b/templates/v5.6/authn/client/jwt.tmpl similarity index 100% rename from templates/v5.4/authn/client/jwt.tmpl rename to templates/v5.6/authn/client/jwt.tmpl diff --git a/templates/v5.4/authn/client/mtls.tmpl b/templates/v5.6/authn/client/mtls.tmpl similarity index 100% rename from templates/v5.4/authn/client/mtls.tmpl rename to templates/v5.6/authn/client/mtls.tmpl diff --git a/templates/v5.4/authn/client/oidc.tmpl b/templates/v5.6/authn/client/oidc.tmpl similarity index 100% rename from templates/v5.4/authn/client/oidc.tmpl rename to templates/v5.6/authn/client/oidc.tmpl diff --git a/templates/v5.4/authn/server/mtls.tmpl b/templates/v5.6/authn/server/mtls.tmpl similarity index 100% rename from templates/v5.4/authn/server/mtls.tmpl rename to templates/v5.6/authn/server/mtls.tmpl diff --git a/templates/v5.4/authn/server/token.tmpl b/templates/v5.6/authn/server/token.tmpl similarity index 100% rename from templates/v5.4/authn/server/token.tmpl rename to templates/v5.6/authn/server/token.tmpl diff --git a/templates/v5.4/authz/client/jwt-authz-map.tmpl b/templates/v5.6/authz/client/jwt-authz-map.tmpl similarity index 100% rename from templates/v5.4/authz/client/jwt-authz-map.tmpl rename to templates/v5.6/authz/client/jwt-authz-map.tmpl diff --git a/templates/v5.4/authz/client/jwt.tmpl b/templates/v5.6/authz/client/jwt.tmpl similarity index 100% rename from templates/v5.4/authz/client/jwt.tmpl rename to templates/v5.6/authz/client/jwt.tmpl diff --git a/templates/v5.4/devportal/backstage.tmpl b/templates/v5.6/devportal/backstage.tmpl similarity index 100% rename from templates/v5.4/devportal/backstage.tmpl rename to templates/v5.6/devportal/backstage.tmpl diff --git a/templates/v5.4/http.tmpl b/templates/v5.6/http.tmpl similarity index 95% rename from templates/v5.4/http.tmpl rename to templates/v5.6/http.tmpl index b8397ad9..2b0046b1 100644 --- a/templates/v5.4/http.tmpl +++ b/templates/v5.6/http.tmpl @@ -66,12 +66,19 @@ map {{ m.match }} {{ m.variable }} { {# --- Maps section for authorization --- #} {%- if declaration.authorization -%} +# Authorization profiles variables_hash_bucket_size 512; +map_hash_bucket_size 256; {% for authzprofile in declaration.authorization -%} include "{{ ncgconfig.nms.authz_client_dir }}/{{ authzprofile.name | replace(" ", "_") }}.maps.conf"; {% endfor -%} {%- endif -%} +{# --- Maps section for API Gateway parameters enforcement --- #} + +# API Gateway parameter enforcement maps +include "{{ ncgconfig.nms.apigw_maps_dir }}/*.conf"; + {# --- Snippets section --- #} {% if declaration.snippet and declaration.snippet.content %}{{ declaration.snippet.content | b64decode }}{% endif %} diff --git a/templates/v5.4/logformat.tmpl b/templates/v5.6/logformat.tmpl similarity index 100% rename from templates/v5.4/logformat.tmpl rename to templates/v5.6/logformat.tmpl diff --git a/templates/v5.4/misc/acme.tmpl b/templates/v5.6/misc/acme.tmpl similarity index 100% rename from templates/v5.4/misc/acme.tmpl rename to templates/v5.6/misc/acme.tmpl diff --git a/templates/v5.4/misc/resolver.tmpl b/templates/v5.6/misc/resolver.tmpl similarity index 100% rename from templates/v5.4/misc/resolver.tmpl rename to templates/v5.6/misc/resolver.tmpl diff --git a/templates/v5.4/misc/server-http.tmpl b/templates/v5.6/misc/server-http.tmpl similarity index 98% rename from templates/v5.4/misc/server-http.tmpl rename to templates/v5.6/misc/server-http.tmpl index 0095f8cc..00028a3d 100644 --- a/templates/v5.4/misc/server-http.tmpl +++ b/templates/v5.6/misc/server-http.tmpl @@ -83,7 +83,7 @@ server { {%- if s.app_protect.log -%} {%- if s.app_protect.log.enabled == True -%} app_protect_security_log_enable on; - {%- if s.app_protect.log.profile_name -%} + {% if s.app_protect.log.profile_name -%} app_protect_security_log "{{ ncgconfig.nms.nap_logformats_dir_pum }}/{{ s.app_protect.log.profile_name }}.tgz" syslog:server={{ s.app_protect.log.destination }}; {% endif -%} {% endif %} @@ -192,13 +192,14 @@ server { {%- if loc.urimatch|lower == "best" %} ^~ {% endif %} {%- endif -%} {{ loc.uri }} { + status_zone {{ loc.uri | replace(" ", "_") }}; {% if loc.authentication and loc.authentication.server and loc.authentication.server[0].profile -%} include "{{ ncgconfig.nms.auth_server_dir }}/{{ loc.authentication.server[0].profile | replace(" ", "_") }}.conf"; {% endif -%} {%- if loc.upstream %}proxy_pass {{ loc.upstream }};{% endif -%} - {%- if loc.log.access %}access_log {{ loc.log.access.destination }}{% if loc.log.access.format %} {{ loc.log.access.format }}{% endif %}{% if loc.log.access.condition %} if={{ loc.log.access.condition }}{% endif %};{% endif -%} + {%- if loc.log.access %}access_log {{ loc.log.access.destination }}{% if loc.log.access.format %} {{ loc.log.access.format }}{% endif %}{% if loc.log.access.condition %} if={{ loc.log.access.condition }}{% endif %};{% endif %} {% if loc.log.error %}error_log {{ loc.log.error.destination }}{% if loc.log.error.level %} {{ loc.log.error.level }}{% endif %};{% endif %} @@ -337,7 +338,7 @@ server { {% endif %} {% endif %} - {% if loc.apigateway and loc.apigateway.api_gateway.enabled == True %} + {% if loc.apigateway and loc.apigateway.api_gateway.enabled == True -%} include "{{ ncgconfig.nms.apigw_dir }}/{{ s.names[0] }}{{ loc.uri }}.conf"; {% endif %} diff --git a/templates/v5.4/misc/server-stream.tmpl b/templates/v5.6/misc/server-stream.tmpl similarity index 100% rename from templates/v5.4/misc/server-stream.tmpl rename to templates/v5.6/misc/server-stream.tmpl diff --git a/templates/v5.4/misc/upstream-http.tmpl b/templates/v5.6/misc/upstream-http.tmpl similarity index 100% rename from templates/v5.4/misc/upstream-http.tmpl rename to templates/v5.6/misc/upstream-http.tmpl diff --git a/templates/v5.4/misc/upstream-stream.tmpl b/templates/v5.6/misc/upstream-stream.tmpl similarity index 100% rename from templates/v5.4/misc/upstream-stream.tmpl rename to templates/v5.6/misc/upstream-stream.tmpl diff --git a/templates/v5.4/nginx-conf/license-key.tmpl b/templates/v5.6/nginx-conf/license-key.tmpl similarity index 100% rename from templates/v5.4/nginx-conf/license-key.tmpl rename to templates/v5.6/nginx-conf/license-key.tmpl diff --git a/templates/v5.4/nginx-conf/mime.types b/templates/v5.6/nginx-conf/mime.types similarity index 100% rename from templates/v5.4/nginx-conf/mime.types rename to templates/v5.6/nginx-conf/mime.types diff --git a/templates/v5.4/nginx-conf/nginx.conf b/templates/v5.6/nginx-conf/nginx.conf similarity index 86% rename from templates/v5.4/nginx-conf/nginx.conf rename to templates/v5.6/nginx-conf/nginx.conf index de18d5d9..7e46c902 100644 --- a/templates/v5.4/nginx-conf/nginx.conf +++ b/templates/v5.6/nginx-conf/nginx.conf @@ -61,5 +61,12 @@ mgmt { # Set to 'off' to trust all SSL certificates (not recommended). # Useful for reporting to NGINX Instance Manager without a local PKI. ssl_verify {% if nginxconf.license.ssl_verify == True %}on{% else %}off{% endif %}; + + {% if nginxconf.license.proxy %}proxy {{ nginxconf.license.proxy }};{% endif %} + + {% if nginxconf.license.proxy_username %}proxy_username {{ nginxconf.license.proxy_username }};{% endif %} + + {% if nginxconf.license.proxy_password %}proxy_password {{ nginxconf.license.proxy_password }};{% endif %} + } {% endif %} \ No newline at end of file diff --git a/templates/v5.4/stream.tmpl b/templates/v5.6/stream.tmpl similarity index 100% rename from templates/v5.4/stream.tmpl rename to templates/v5.6/stream.tmpl diff --git a/templates/v5.4/visibility/moesif/http.tmpl b/templates/v5.6/visibility/moesif/http.tmpl similarity index 100% rename from templates/v5.4/visibility/moesif/http.tmpl rename to templates/v5.6/visibility/moesif/http.tmpl diff --git a/templates/v5.4/visibility/moesif/server.tmpl b/templates/v5.6/visibility/moesif/server.tmpl similarity index 100% rename from templates/v5.4/visibility/moesif/server.tmpl rename to templates/v5.6/visibility/moesif/server.tmpl diff --git a/webui/IMPLEMENTATION.md b/webui/IMPLEMENTATION.md index 11670441..6bdf4ae4 100644 --- a/webui/IMPLEMENTATION.md +++ b/webui/IMPLEMENTATION.md @@ -308,7 +308,6 @@ location /v5.5/ { - [Web UI README](../webui/README.md) - Detailed Web UI documentation - [USAGE-v5.5.md](../USAGE-v5.5.md) - API v5.5 usage guide - [Docker Compose README](../contrib/docker-compose/README.md) - Deployment guide -- [OpenAPI Spec](../openapi.json) - Complete API specification ## ๐Ÿค Contributing